IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques Discussion :

Extraction d'image avec ffmpeg


Sujet :

Bibliothèques

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 9
    Points
    9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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");
    }

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/01/2012, 22h38
  2. Réponses: 0
    Dernier message: 28/05/2010, 17h10
  3. Problème avec ffmpeg pour encoder des images Recherche :
    Par hppp01 dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 15/12/2008, 10h04
  4. Convertir une image en format YUV avec ffmpeg
    Par cedouche dans le forum Bibliothèque standard
    Réponses: 0
    Dernier message: 30/07/2008, 11h50
  5. Réponses: 1
    Dernier message: 30/06/2008, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo