Précédent   Forum du club des développeurs et IT Pro > C et C++ > Bibliothèques > Autres
Autres Vos questions sur les autres bibliothèques
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/01/2013, 10h34   #1
K0rrigan
Invité de passage
 
Homme Loïc BREUIL
Étudiant
Inscription : mars 2012
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Loïc BREUIL
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2012
Messages : 4
Points : 3
Points : 3
Par défaut Extraction d'image avec ffmpeg

Salut tous le monde, si je viens vers vous aujourd'hui c'est que je bloque un peu sur la bibliothèque ffmpeg.
En clair je souhaiterais faire l'équivalent de cette ligne de commande en C/C++:
Code :
ffmpeg -i film.avi -y -f image2 out/frame%04d.png
Pour info cette ligne de commande extraits les images du flux vidéo et les enregistre en png. Je pense avoir la base du programme mais je bloque sur l'extraction "frame by frame".

Si quelqu'un a déjà fait ce genre de chose, je ne dirais pas non à un petit coup de pouce.

Merci d'avance K0rrigan
PS voici mon code pour l'instant:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <Windows.h>
#include <tools\img\CPNGFile.h>
extern"C"{
	#include <libavcodec\avcodec.h>
	#include <libavformat\avformat.h>
}
 
 
using namespace std;
 
void main(){
	/*Autorise l'utilisation de tous les codec*/
	av_register_all();
 
	/*Mise en place du contexte*/
	AVFormatContext* pCtx;
 
 
	/*Ouverture d'un fichier vidéo return 0 if OK. AVERROR otherwise.*/
	if(av_open_input_file(&pCtx,"film.avi",NULL,0,NULL) != 0){
		cout<<"Erreur de chargement de la video"<<endl;
		exit(-1);
	}
	cout<<"Chargement de la video termine"<<endl;
 
 
 
 
	/*Récupération des informations sur les flux return >=0 if OK. AVERROR if error.*/
	if(av_find_stream_info(pCtx) < 0){
		cout<<"Erreur de recuperation des informations relatives aux fux"<<endl;
		exit(-1);
	}
	cout<<"Recuperation des informations relative aux flux:"<<endl<<endl;
	dump_format(pCtx,0,"film.avi",0);
 
 
 
 
	/*Le pointeur pCtx est un buffer contenant des pointeurs sur tous les flux 
	du fichier, nous devonc le parcourir afin de trouver le flux vidéo te le flux audio*/
	int videoStreamIndex = -1;
	for(unsigned int i=0; i<pCtx->nb_streams; i++){
		if(pCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){
			videoStreamIndex = i;
		}
	}
	if(videoStreamIndex == -1)
		exit(-1);
 
 
 
 
	/*Si il existe un flux vidéo on récupère le codec*/
	AVCodecContext *pCodecCtx = pCtx->streams[videoStreamIndex]->codec;
	AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
	if(pCodec == NULL){
		cout<<"Erreur de recuperation du codec"<<endl;
		exit(-1);
	}
	/*On ouvre le codec*/
	if(avcodec_open(pCodecCtx,pCodec)<0){
		cout<<"Erreur d'ouverture du codec"<<endl;
		exit(-1);
	}
	cout<<"Ouverture du codec"<<endl;
 
 
 
 
	/*Récupération des frames*/
 
	/*Pause*/
	system("pause");
}
K0rrigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 14h22   #2
gbdivers
Expert Confirmé Sénior

 
Homme Guillaume Belz
Biochimiste
Inscription : novembre 2008
Messages : 5 293
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Belz
Âge : 37
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 5 293
Points : 19 577
Points : 19 577
Salut

Comme ffmpeg est une lib C, l'idéal en C++ est d'encapsuler les appels de fonctions et structures dans un design pattern Wrapper.

Sinon, tu bloques sur quoi exactement ? La suite après avoir ouvert ?
Je suis pas spécialiste de FFmpeg, mais regarde peut être cet exemple, qui extrait une vidéo : http://ffmpeg.org/doxygen/trunk/doc_...c-example.html

Sinon (mais je suppose que c'est pas ce que tu veux), tu peux appeler directement ta ligne de commande en C++ avec system() ou un QProcess (par exemple)

Bon courage
__________________
Merci à toutes les bénévoles avec qui j'ai travaillé sur les rubriques C++, Qt et Jeux.

Retrouvez mes anciennes publications sur GitHub et suivez mes futures publications sur Google+.

Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5.
gbdivers est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h59.


 
 
 
 
Partenaires

Hébergement Web