Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Membre à l'essai Avatar de Revan777
    Inscrit en
    mars 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : mars 2005
    Messages : 87
    Points : 24
    Points
    24

    Par défaut Décodage FLV - librairie libavcodec (ffmpeg)

    Bonjour,
    Je dois transcoder un extrait FLV en MJPEG avec les librairies ffmpeg mais il me reste quelques points obscurs et je ne trouve pas d'aides très explicites sur le net.
    Je n'ai jamais fait de décodage avec ffmpeg, c'est donc la partie décodage FLV qui me pose problème.
    (j'utilise libavcodec en version 51.7.0)

    FLV : 570 ko, 480*360, pas d'audio, codec Sorenson H263

    - Ai-je correctement initialisé la bibliothèque ?
    - Ai-je correctement rempli les paramètres de l'AvCodecContext m_pCodecCtx ?
    - Quel est le PixelFormat pour le FLV ? PIX_FMT_YUVJ420P ?

    Le code suivant est un extrait de mon original mais devrait suffire à la compréhension de ma démarche.

    Note : Initialement, je récupérais toutes les données de mon FLV pour les passer à avcodec_decode_video() que j'ai modifié ensuite pour le découper et passer seulement des paquets de 16384 octets.
    - la fonction avcodec_find_decoder(CODEC_ID_FLV1) ne retourne pas d'erreur
    - avcodec_decode_video() retourne -1
    - si je remplace CODEC_ID_FLV1 par CODEC_ID_H263 dans avcodec_find_decoder(), avcodec_decode_video() ne retourne pas d'erreur mais got_picture reste à 0 !

    Merci par avance si quelqu'un peut m'éclairer de son expérience dans ce domaine.

    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
    77
    78
    79
    80
    81
    82
    avcodec_init();
    av_register_all();
     
    m_pCodecCtx = avcodec_alloc_context();
    avcodec_get_context_defaults(m_pCodecCtx);
     
    m_pCodecCtx->width=m_iWidth;    // Width of the input FLV video: 480
    m_pCodecCtx->height=m_iHeight;  // Heigth of the input FLV video: 360
     
    // RGB24 Context Init
    m_pRGB24CodecCtx = avcodec_alloc_context();
    m_pRGB24CodecCtx->width=m_iWidth;
    m_pRGB24CodecCtx->height=m_iHeight;
    m_pRGB24CodecCtx->pix_fmt = (PixelFormat)PIX_FMT_BGR24;
    m_pRGB24Frame = avcodec_alloc_frame();   
     
    switch(m_iCodecID)
    {     
          case CODEC_ID_FLV1 :                           
                m_pCodec = avcodec_find_decoder(CODEC_ID_FLV1);
    //CODEC_ID_H263);
                if (!m_pCodec)
                {
                      return false; // !!! !!! !!!
                }
     
                m_pCodecCtx->thread_count      = 1;
                m_pCodecCtx->workaround_bugs   = FF_BUG_AUTODETECT;
                m_pCodecCtx->error_resilience  = FF_ER_COMPLIANT;
                m_pCodecCtx->error_concealment = 3; 
                m_pCodecCtx->idct_algo         = FF_IDCT_AUTO;
                m_pCodecCtx->debug             = 0;
                m_pCodecCtx->debug_mv          = 0;                  
     
                //m_pCodecCtx->codec_tag         = 2;                
     
                // Inform the codec that we can handle truncated bitstreams -- i.e.,
                // bitstreams where frame boundaries can fall in the middle of packets
                if(m_pCodec->capabilities & CODEC_CAP_TRUNCATED)
                      m_pCodecCtx->flags|=CODEC_FLAG_TRUNCATED;
     
                if (avcodec_open(m_pCodecCtx, m_pCodec) < 0)
                {
                      return false; // !!! !!! !!!
                }
     
                m_pCodecCtx->pix_fmt = (PixelFormat) PIX_FMT_YUVJ420P; // or PIX_FMT_RGB24 ?
                break;
     
          default:                
                CString sMsg;
                sMsg.Format(_T("[CVideoCodec::%d] ERROR not implemented"),int(this));
                m_pSession->WriteLog(sMsg,1);
                break;
          }
     
          m_iPixFmt = m_pCodecCtx->pix_fmt;
     
          } else
          {
                m_pCodecCtx->pix_fmt = (PixelFormat) m_iPixFmt;
          }     
     
          m_pInputFrame = avcodec_alloc_frame();
          int numBytes=avpicture_get_size(m_iPixFmt, m_pCodecCtx->width, m_pCodecCtx->height);
          m_buffer=new unsigned char[numBytes];
          avpicture_fill((AVPicture *)m_pInputFrame, m_buffer, m_iPixFmt,
    m_pCodecCtx->width, m_pCodecCtx->height);   
     
          m_pOutputFrame= avcodec_alloc_frame();
     
    }
     
    int got_picture = 0;
    int iDecodedBytesCount = 0;                    
     
    iDecodedBytesCount = avcodec_decode_video ( m_pCodecCtx,
                            m_pInputFrame,
                            //m_pOutputFrame,
                            &got_picture,
                            Buffer,                      
                            uiBufferUsed );

  2. #2
    Nouveau Membre du Club

    Homme Profil pro Rodrigue saoungoumi sourpele
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme Rodrigue saoungoumi sourpele
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 4
    Points : 30
    Points
    30

    Par défaut video image par image

    Bonjours à tous. c'est un honneur pour moi de m'adresser à vous.
    en fait je suis en train d'écrire en C/C++ un algorithme d'encodage vidéo personnalisé.
    pour ce faire j'ai besoin de faire des opérations précises sur chaque image d'un fux vidéo (piste vidéo d'un fichier audiovisuel), donc d'extraire la vidéo image par image.

    j'ai déjà une commande (ffmpeg intégrable dans une programme C) qui extrait tous les images d'une vidéo: par exemple "ffmpeg -i video/Adele-Hometown_Glory.mp4 -r 25 images/img%8d.bmp"

    mais le problème c'est que j'aimerais travailler directement sur la sortie de ffmpeg pour chaque image c'est-dire-dire à l'instant où elle est extraite (pas après la fins de l'extraction de tous les images)

    merci d'avance!

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •