【发布时间】:2012-11-21 06:11:07
【问题描述】:
最近我将 ffmpeg 从 0.9 升级到 1.0(在 Win7x64 和 iOS 上测试),现在是 avcodec_decode_video2 seagfaults。长话短说:每次视频尺寸发生变化时都会发生崩溃(例如,从 320x240 变为 160x120,反之亦然)。
我从一些专有来源接收 mpeg4 视频流并像这样解码它:
// once, during initialization:
AVCodec *codec_ = avcodec_find_decoder(CODEC_ID_MPEG4);
AVCodecContext ctx_ = avcodec_alloc_context3(codec_);
avcodec_open2(ctx_, codec_, 0);
AVPacket packet_;
av_init_packet(&packet_);
AVFrame picture_ = avcodec_alloc_frame();
// on every frame:
int got_picture;
packet_.size = size;
packet_.data = (uint8_t *)buffer;
avcodec_decode_video2(ctx_, picture_, &got_picture, &packet_);
再一次,在我升级到 1.0 之前,上述所有操作都完美无缺。现在,每次框架尺寸发生变化时 - avcodec_decode_video2 都会崩溃。请注意,我没有在 AVCodecContext 中分配宽度/高度 - 无论是在开始时,还是在流更改时 - 这可能是原因吗?
如有任何想法,我将不胜感激!
更新:设置 ctx_.width 和 ctx_.height 没有帮助。
Update2:就在崩溃之前,我收到以下日志消息:
mpeg4,级别 24:“找到 2 个未释放的缓冲区!”。 级别 8:“断言 i buffer_count 在 libavcodec/utils.c:603 失败”
Update3 升级到 1.1.2 修复了这个崩溃问题。解码器能够再次处理动态的尺寸变化。
【问题讨论】:
-
我认为“即时”更改帧大小是不正确的。以前可以使用的事实是一个意外。每次帧大小发生变化时,您都必须重新启动解码器。
-
@pogorskiy 多年来,它“偶然”地工作了很多年,经历了许多版本!我应该如何重新启动解码器?
-
@pogorskiy : 调用
avcodec_close/avcodec_open2解决了这个问题!请把你的评论作为答案,我会接受的。
标签: ffmpeg libavcodec