繁体   English   中英

使用LibAV将压缩的帧解码到内存:avcodec_decode_video2?

[英]Decode compressed frame to memory using LibAV: avcodec_decode_video2?

我对libAV完全陌生。

我有一个来自其他地方的视频帧(在内存中,而不是文件中)。 它应该是H.264编码的关键帧。

我正在尝试使用avcodec_decode_video2进行解码, avcodec_decode_video2是我需要的正确函数吗?

我在使用此代码时遇到问题(基本上取自FFmpeg,使用avcodec_decode_video2解码原始缓冲区 ):

AVCodecContext  *m_pCodecCtx;
AVCodec         *m_pCodec;
AVFrame         *m_pFrame;

m_pCodec= avcodec_find_decoder(CODEC_ID_H264);
m_pCodecCtx = avcodec_alloc_context3(m_pCodec);
avcodec_open2(m_pCodecCtx,m_pCodec,0);

// since avcodec_alloc_frame() isn't existing anymore, I changed to following:
//m_pFrame=m_fc.avcodec_alloc_frame(); // and what is/was m_fc?!?
m_pFrame = av_frame_alloc();


AVPacket        packet;
av_init_packet(&packet);

packet.data = (unsigned char*)mData;
packet.size=(int)mDataSize;

// this is for decoding a keyframe?
packet.flags |= AV_PKT_FLAG_KEY;

int framefinished=0;
int nres=avcodec_decode_video2(m_pCodecCtx,m_pFrame,&framefinished,&packet);

if(framefinished)
{
    std::cout << "decoded frame" << std::endl
}

不幸的是framefinished总是返回0,而nres是18331,等于mDataSize

我的错在哪里 我是否必须更清楚地指定编解码器信息? 我的包裹是否破损或不完整? 我使用了错误的libAV函数吗?

在我使用的框架的示例代码中,使用av_interleaved_write_frame (和AvFormatContext )将图像数据成功地流式传输到文件。 这可以帮助我配置数据包或编解码器吗?

如果nres为正,并且等于mDataSize则表示一切正常,使用此数据包完成解码。 framefinished == 0仅表示未写入帧。

可能是因为帧数据在多个数据包之间共享,所以您需要使用以下数据包调用avcodec_decode_video2 ,直到获得完整的帧为止。

另一个可能的解释是:您的编解码器在输入和输出之间有延迟:在第一次调用时没有任何帮助,并且需要使用空数据包的最后一次调用才能获得最后一帧。 您需要做的是打电话给类似

AVPacket emptyPacket;
av_init_packet(&emptyPacket);
emptyPacket.data = NULL;
emptyPacket.size = 0;
emptyPacket.stream_index = packet.stream_index;
nres=avcodec_decode_video2(m_pCodecCtx,m_pFrame,&framefinished,&emptyPacket);

此处查看有关CODEC_CAP_DELAY的注释

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM