Mpeg2 ts 同步字节和连续性错误

Mpeg2 ts sync byte and continuity error

我有一个项目,我必须编写一个 ts 文件解析器。解析器应该读取一个 ts 文件并从文件的每个数据包的 headers 输出一些数据。我必须打印的两个输出是,如果有同步错误(以及有多少)和数字连续性计数器错误。

首先关于同步错误。我知道数据包的第一个字节是指同步字节。所以,我们有一个同步错误,如果数据包的同步字节没有它应该的 0x47 值?那么如果文件中有 100 个数据包,并且有 30 个同步字节 "bad",则有 30 个同步错误?

关于连续性计数器错误,我希望有人用简单的语言解释如何查找是否存在连续性错误,因为我阅读的 mpeg2 标准没有太大帮助。 谢谢

同步字节错误是指 TS 数据包的第一个字节不包含值 0x47。在这种情况下,支持不同的 TS 数据包长度可能是明智的。通常一个 TS 数据包是 188 字节长,但你可能会遇到不同的数据包长度,例如如果添加了 Reed-Solomon 错误保护,则 TS 数据包长度为 204 字节。
ISO 13818-1 标准对于什么是连续性计数 (CC) 错误非常清晰明确。简单来说,每个TS数据包包含一个13位的PID(数据包标识符)字段和一个4位的CC(连续性计数)字段。 相同 PID 的连续数据包必须包含递增的 CC 值(模数 16,因此在 CC = 15 之后跟随 CC = 0)if 数据包包含有效载荷(可以从 adaptation_field_control 标志中确定)。因此,您需要分别跟踪每个 PID 的 CC 值。如果 CC 值存在差距,例如CC = 7 在 CC = 5 之后,这是一个 CC 错误。 必须特别注意重复的 CC 值。 CC 值可以重复一次,例如CC = 5 在两个连续的 TS 数据包中(具有相同的 PID)。如果 CC 值重复两次以上,这也构成 CC 错误。
请注意,空数据包 (PID = 0x1FFF = 8191) 不会导致 CC 错误,因为它们的 CC 字段的值未定义(标准允许在空数据包的情况下使用任意 CC 值)。
另一个例外是当设置 discontinuity_indicator 标志时,CC 值可能会更改为任意值,这不算作 CC 错误事件。

您可能想看看 ETSI ETR 290,它定义了 DVB 系统的一些测量准则。其中有一些关于如何计算 CC 错误的提示。

我遇到过 mpeg 系统流,其中 ts 数据包之间存在间隙。值得注意的是,间隙的形式非常特殊,所有间隙都由等于当前间隙长度的字节填充。 例如,如果间隙的长度等于 4,则存在以下模式 04 04 04 04 47 ... VLC 播放器播放此类流时不会报告或观察到错误。 严格来说这是一个同步错误。

如果您采用兼容的 mpeg 系统流并在两个连续的 ts 数据包之间插入说以下字节模式 '04 04 04 04',甚至 ffmpeg/ffplay 也不会将此填充数据识别为同步错误,采用 'ffmpeg -i -f null /dev/null'

ffmpeg 具有内置的 FEC 自动检测(FEC 模式可以附加在一些或所有 ts 数据包的末尾)。因此,ffmpeg 会跳过 ts 数据包之间的填充数据,除非填充数据的长度小于预定义的阈值。