如何使用avcodec_open2设置AV_FRAME_FLAG_DISCARD

问题描述 投票:0回答:1

我想丢弃损坏的 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#)

c# ffmpeg
1个回答
0
投票

discardcorrupt
适用于容器中损坏的数据包,而不是解码错误。

要检测解码损坏,请在返回的 AVFrame 中测试

decode_error_flags
AVFrame->flags & AV_FRAME_FLAG_CORRUPT

© www.soinside.com 2019 - 2024. All rights reserved.