H264: 使用FFmpeg解码一系列NAL单元

5

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

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);

我已经通过了所有单元测试,但是frameFinished始终为0。我猜测pCodecContext的设置可能有问题。有人能给我发送一个可工作的示例吗?

谢谢


为了使解码器能够解码您的视频,在正确解码切片/帧之前,您需要向其提供流参数集和图像参数集NAL单元。 - Flame
2个回答

4

看看这个教程,它应该能解码任何类型的视频,包括H.264:

http://dranger.com/ffmpeg/

我不确定什么导致了问题,但我怀疑与您未使用libavformat中的av_read_frame逐帧解析数据有关。 H.264具有将一帧分割为多个切片以及多个NAL单元的功能。

我很确定x264编码器默认情况下不会执行此操作,并且每帧产生一个NAL单元。 但是,还有其他流信息的NAL单元需要提供给解码器。 我过去做过这方面的实验,并发现当av_read_frame解析出一帧的数据时,它有时会包含多个NAL单元。 我建议您密切关注教程并查看是否有效。

另外,如果你所说的起始代码(0x00000001)是指的第一个4个字节的NAL单元,则我认为你确实需要将其传递到avcodec_decode_video。 经过调查,从av_read_frame输出的数据中,启动代码仍然存在于传递给解码器的数据中。


1
在编解码器上下文实例化代码后尝试这个:
  if(pCodec->capabilities & CODEC_CAP_TRUNCATED)
      pCodecContext->flags |= CODEC_FLAG_TRUNCATED; /* We may send incomplete frames */
  if(pCodec->capabilities & CODEC_FLAG2_CHUNKS)
      pCodecContext->flags2 |= CODEC_FLAG2_CHUNKS;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接