1

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

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

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

4

2 回答 2

5

同步字节错误是指 TS 数据包的第一个字节不包含值 0x47。在这种情况下,支持不同的 TS 数据包长度可能是明智的。通常一个 TS 包长 188 字节,但您可能会遇到不同的包长度,例如,如果添加了 Reed-Solomon 错误保护,则 TS 包是 204 字节长。
ISO 13818-1 标准对什么是连续性计数 (CC) 错误非常清楚和明确。简单来说,每个 TS 包包含一个 13 位的 PID(包标识符)字段和一个 4 位的 CC(连续性计数)字段。如果数据包包含有效载荷(可以从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 错误的提示。

于 2016-03-15T15:32:27.743 回答
0

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

如果您采用兼容的 mpeg 系统流并在两个连续的 ts 数据包之间插入以下字节模式 '04 04 04 04',即使 ffmpeg/ffplay 也无法将此填充数据识别为同步错误,请使用 'ffmpeg -i -f空/开发/空'

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

于 2017-12-10T09:39:28.220 回答