我想丢弃损坏的 H.264 帧,但我一直无法实现这一点。我尝试在创建上下文后设置标志以及使用选项,但这两种方法都不起作用,而且我仍然看到损坏的帧。在线示例通过格式上下文演示了这一点,但就我而言,我直接从套接字提供字节流。
选项版本
ffmpeg.av_dict_set(&options, "fflags", "discardcorrupt", 0);
var ret = ffmpeg.avcodec_open2(_CodecContext, _decodingCodec, &options);
ffmpeg.av_dict_free(&options);
旗帜版本
var ret = ffmpeg.avcodec_open2(_CodecContext, _decodingCodec, null);
_CodecContext->flags |= ffmpeg.AV_FRAME_FLAG_DISCARD;
我想避免以下错误:
[h264 @ 000001fb6302dfc0] decode_slice_header error
[h264 @ 000001fb6302dfc0] decode_slice_header error
[H264 Decoder @ 000001fb70778740] Broken frame packetizing
[h264 @ 000001fb6302dfc0] illegal short term buffer state detected
avcodec_send_packet 或 avcodec_receive_frame 返回错误,返回值始终为 0。目前我无法捕获此问题,并且我不想使用全局日志记录检查,因为我的解码器可能有 16 个实例。 (央视网格)。我使用 ffmpeg.autogen (c#)
discardcorrupt
适用于容器中损坏的数据包,而不是解码错误。
要检测解码损坏,请在返回的 AVFrame 中测试
decode_error_flags
或 AVFrame->flags & AV_FRAME_FLAG_CORRUPT
。