我尝试使用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设置一定有问题。有人能给我一个有效的例子吗?
谢谢
答案 0 :(得分:4)
查看本教程。它应该能够解码任何视频类型,包括H.264:
我不知道究竟是什么导致了这个问题,但我怀疑这与你没有使用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;