2010-07-20 20 views
3

J'ai essayé de décoder une série d'unités nales avec ffmpeg (libavcodec) mais j'obtiens une erreur «sans trame». J'ai produit les unités nal avec la ligne directrice au How does one encode a series of images into H264 using the x264 C API?. J'ai essayé la stratégie suivante pour le décodage:H264: décoder des séries d'unités natives avec ffmpeg

avcodec_init(); 
avcodec_register_all(); 
AVCodec* pCodec; 
pCodec=lpavcodec_find_decoder(CODEC_ID_H264); 
AVCodecContext* pCodecContext; 
pCodecContext=lpavcodec_alloc_context(); 
avcodec_open(pCodecContext,pCodec); 
AVFrame *pFrame; 
pFrame=avcodec_alloc_frame(); 
//for every nal unit:  
    int frameFinished=0; 
    //nalData2 is nalData without the first 4 bytes 
    avcodec_decode_video(pCodecContext,pFrame,&frameFinished,(uint8_t*) nalData2,nalLength); 

J'ai passé toutes les unités que je suis arrivé à ce code, mais frameFinished séjours 0. Je suppose qu'il doit y avoir quelque chose de mal avec la configuration pCodecContext. Quelqu'un peut-il m'envoyer un exemple de travail?

Merci

+0

Pour le décodeur pour être en mesure de décoder votre vidéo, vous devez alimenter un paramètre de flux définis et paramètres d'image unités NAL avant de pouvoir décoder correctement tranches/cadres. – Flame

Répondre

3

Découvrez ce tutoriel. Il doit être capable de décoder tous les types de vidéo, y compris H.264:

http://dranger.com/ffmpeg/

Je ne sais pas exactement ce qui pose le problème, mais je pense qu'il a quelque chose à voir avec le fait que vous n'êtes pas en utilisant le av_read_frame de libavformat pour analyser une valeur de cadres de données à la fois. H.264 a la capacité de diviser une trame en plusieurs tranches et donc plusieurs unités NAL.

Je suis assez sûr que l'encodeur x264 ne le fait pas par défaut et produit une unité NAL par trame. Cependant, il existe des unités NAL avec d'autres informations de flux qui doivent être envoyées au décodeur. J'ai expérimenté avec ceci dans le passé et quand av_read_frame analyse une valeur de cadres de données, il contient parfois plusieurs unités NAL. Je suggère de suivre le tutoriel de près et voir si cela fonctionne.

Une autre chose est que je pense que vous avez besoin de passer les 4 premiers octets de l'unité NAL dans avcodec_decode_video si tel est le code de démarrage vous parlez (0x00000001). Ayant examiné la sortie de av_read_frame, les codes de départ sont toujours dans les données lorsqu'il est transmis au décodeur.

0

Essayez ceci après le code contexte codec instanciation:

if(pCodec->capabilities & CODEC_CAP_TRUNCATED) 
     pCodecContext->flags |= CODEC_FLAG_TRUNCATED; /* We may send incomplete frames */ 
    if(pCodec->capabilities & CODEC_FLAG2_CHUNKS) 
     pCodecContext->flags |= CODEC_FLAG2_CHUNKS;