H264: décoder série d'unités nal avec ffmpeg
J'ai essayé de décoder une série d'unités nal avec ffmpeg (libavcodec) mais je reçois un "non cadre" d'erreur. J'ai produit nal unités à la ligne directrice à Comment coder une série d'images en H264 à l'aide de l'x264 C API?. J'ai essayé de la stratégie suivante pour le décodage:
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, je suis arrivé à ce code mais frameFinished les séjours de 0. Je suppose qu'il doit y avoir quelque chose de mal avec l'pCodecContext de l'installation. Quelqu'un peut m'envoyer un exemple de travail?
Merci
Pour le décodeur pour être capable de décoder de la vidéo, vous avez besoin de nourrir un flux de jeu de paramètres d'image et un jeu de paramètres d'unités NAL avant de pouvoir décoder correctement les tranches ou les cadres.
OriginalL'auteur jsim | 2010-07-20
Vous devez vous connecter pour publier un commentaire.
Découvrez ce tutoriel. Il devrait être en mesure de décoder n'importe quel type de vidéo, y compris H. 264:
http://dranger.com/ffmpeg/
Je ne sais pas exactement ce qui est à l'origine du problème, mais je soupçonne qu'il a quelque chose à voir avec le fait que vous n'êtes pas à l'aide de la
av_read_frame
de démultiplexeur d'analyser une des trames de données à la fois. H. 264 a la possibilité de diviser une image en plusieurs tranches et, par conséquent, de multiples unités NAL.Je suis sûr que le x264 encodeur ne le fait pas par défaut et produit une unité NAL, image par image. Cependant, il existe des unités NAL avec d'autres flux d'informations qui doivent être nourris au décodeur. J'ai expérimenté cela dans le passé et quand
av_read_frame
analyse de trames 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 pour passer les 4 premiers octets de la dernière unité en
avcodec_decode_video
si c'est le code de départ dont vous parlez (0x00000001
). Ayant étudié la sortie deav_read_frame
, le début de codes sont encore dans les données lorsqu'elles sont transmises au décodeur.OriginalL'auteur Jason B
Essayer après le codec contexte instanciation:
OriginalL'auteur Vladvic