3

我尝试使用 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);

我通过了我得到的所有单元,但 frameFinished 保持为 0。我猜 pCodecContext 设置一定有问题。有人可以给我一个工作示例吗?

谢谢

4

2 回答 2

4

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

http://dranger.com/ffmpeg/

我不知道究竟是什么导致了这个问题,但我怀疑这与您没有使用av_read_framefrom libavformat 一次解析出一帧数据的事实有关。H.264 能够将帧拆分为多个切片,因此可以拆分为多个 NAL 单元。

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

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

于 2010-07-20T03:32:28.977 回答
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;
于 2013-08-01T05:57:42.200 回答