使用LibAV解码压缩帧到内存:avcodec

我对libAV完全陌生。

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

我试图解码与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的注释

链接地址: http://www.djcxy.com/p/67553.html

上一篇: Decode compressed frame to memory using LibAV: avcodec

下一篇: How get sps struct from h264 video with libav ffmpeg