【发布时间】:2014-10-15 09:16:54
【问题描述】:
我对 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)成功地流式传输到一个文件中。这可以帮助我配置我的数据包或编解码器吗?
【问题讨论】:
-
avcodec_decode_video2返回时nres的值是多少?
-
@biskitt
nres = 18331等于mDataSize。avcodec_open2返回 0。我必须在某处指定我的图像分辨率吗?编解码器选项?在大多数示例中,他们使用av_read_frame来填充数据包,但这不适用于这里,对吧?
标签: c++ video ffmpeg decode libav