【问题标题】:H264: decode series of nal units with ffmpegH264:使用ffmpeg解码一系列最终单元
【发布时间】:2011-03-18 05:15:18
【问题描述】:

我尝试使用 ffmpeg (libavcodec) 解码一系列 nal 单元,但出现“无帧”错误。我按照How does one encode a series of images into H264 using the x264 C API? 的指南制作了最终单元。我尝试了以下解码策略:

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 单元,然后它才能正确解码切片/帧。

标签: ffmpeg decode x264


【解决方案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;

【讨论】:

    【解决方案2】:

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

    http://dranger.com/ffmpeg/

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-22
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 2011-08-26
      • 2011-08-24
      • 2020-10-06
      • 2015-06-07
      相关资源
      最近更新 更多