H264:使用 ffmpeg 解码 nal 单元系列

jsi*_*sim 5 ffmpeg decode x264

我尝试使用 ffmpeg (libavcodec) 解码一系列 nal 单元,但出现“无帧”错误。我按照如何使用 x264 C API 将一系列图像编码为 H264? 中的指南生成了最终单元。。我尝试了以下解码策略:

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);
Run Code Online (Sandbox Code Playgroud)

我通过了到达此代码的所有单元,但 frameFinished 仍为 0。我猜 pCodecContext 设置一定有问题。有人可以给我发送一个工作示例吗?

谢谢

Jas*_*n B 4

查看本教程。它应该能够解码任何视频类型,包括 H.264:

http://dranger.com/ffmpeg/

我不知道到底是什么导致了这个问题,但我怀疑这与您没有使用 from av_read_framelibavformat 一次解析出一帧数据有关。H.264 能够将帧分割成多个切片,从而分割成多个 NAL 单元。

我非常确定 x264 编码器默认情况下不会执行此操作,而是每帧生成一个 NAL 单元。然而,还有一些带有其他流信息的 NAL 单元需要馈送到解码器。我过去曾对此进行过实验,当av_read_frame解析出一帧数据时,它有时包含多个 NAL 单元。我建议密切关注本教程,看看是否有效。

另一件事是,我认为您确实需要将 NAL 单元的前 4 个字节传递进去,avcodec_decode_video如果这是您正在谈论的起始代码 ( 0x00000001)。研究了 的输出后av_read_frame,当传递到解码器时,起始码仍然在数据中。