最近、ffmpeg を 0.9 から 1.0 にアップグレードしました (Win7x64 および iOS でテスト済み) avcodec_decode_video2
。簡単に言うと、ビデオのサイズが変更されるたびにクラッシュが発生します (例: 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 < avci->buffer_count が libavcodec/utils.c:603 で失敗しました」
Update3を 1.1.2 にアップグレードすると、このクラッシュが修正されました。デコーダは、オンザフライで次元の変更に再び対処できます。