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

Synchronization Mpeg2 ts同步字节和连续性错误,synchronization,byte,mpeg2-ts,continuity,Synchronization,Byte,Mpeg2 Ts,Continuity,我有一个项目,我必须写一个ts文件解析器。解析器应该读取一个ts文件,并从文件的每个数据包的头中输出一些数据。我必须打印的两个输出是,如果有同步错误(以及有多少)和数字连续性计数器错误 首先是关于同步错误。我知道数据包的第一个字节指的是同步字节。因此,如果数据包的同步字节不具有它应该具有的0x47值,那么我们有一个同步错误?因此,如果文件中有100个数据包,并且30个同步字节是“坏”的,那么会有30个同步错误吗 关于连续性计数器错误,我希望有人用简单的话解释一下如何发现是否存在连续性错误,因为我

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

首先是关于同步错误。我知道数据包的第一个字节指的是同步字节。因此,如果数据包的同步字节不具有它应该具有的0x47值,那么我们有一个同步错误?因此,如果文件中有100个数据包,并且30个同步字节是“坏”的,那么会有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)如果数据包包含有效负载(可通过自适应字段控制标志确定)。因此,您需要分别跟踪每个PID的CC值。如果CC值中存在间隙,例如CC=5后出现CC=7,则为CC错误。 必须特别注意重复的CC值。CC值可以重复一次,例如,在两个连续的TS数据包中CC=5(具有相同的PID)。如果CC值重复两次以上,这也构成CC错误。
请注意,空数据包(PID=0x1FF=8191)不会导致CC错误,因为其CC字段的值未定义(标准允许在空数据包的情况下使用任意CC值)。
另一个例外情况是,如果设置了不连续性_指示器标志,则CC值可能会更改为任意值,这不算作CC错误事件


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

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

如果您采用符合标准的mpeg系统流,并在两个连续ts数据包之间插入(例如)以下字节模式“04”,即使ffmpeg/ffplay无法将此填充数据识别为同步错误,请使用 'ffmpeg-i-f null/dev/null'

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