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++:
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:
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");
} |
Partager