我对libAV完全不熟悉。
我有一个来自其他地方的视频帧(它在内存中,而不是在文件中)。它应该是H.264编码的关键帧。
我正在尝试使用avcodec_decode_video2
进行解码是否符合我的需要?
我在使用此代码时遇到问题(基本上来自FFmpeg decode raw buffer with 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
)将图像数据成功传输到文件。这可以帮助我配置我的数据包或编解码器吗?
答案 0 :(得分:1)
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
here