H264:使用ffmpeg解码一系列nal单位

时间:2010-07-20 01:55:53

标签: ffmpeg decode x264

我尝试使用ffmpeg(libavcodec)解码一系列nal单元,但是我得到了“no frame”错误。我在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设置一定有问题。有人能给我一个有效的例子吗?

谢谢

2 个答案:

答案 0 :(得分:4)

查看本教程。它应该能够解码任何视频类型,包括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的输出后,起始码在传递给解码器时仍然在数据中。

答案 1 :(得分:0)

在编解码器上下文实例化代码之后尝试这个:

  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;