多路分解器如何区分作为同步字节的 0x47 和作为数据的 0x47?

How does the demux differenctiate between the 0x47 that is the sync byte and 0x47 as the data?

对于多路分解器,输入是字节流。一切都只是零和一个。现在解析器如何区分数据中的 0x47 和传输流的同步字节 0x47 header?

比如demux接收到的数据是0x47 0x56 0xef 0x47 ... 它如何知道哪个 0x47 是同步字节?

它是否在同步字节后寻找任何附加位以确保它读取的 0x47 确实是 header 的开始?机制是什么?

这同样适用于任何解析器。 H.264 解析器检查 NAL 起始代码。它如何区分实际的起始码和数据中的起始码。因为对于解析器来说,一切都只是字节。

谢谢。

发送的同步字节正好相隔 188 个字节。如果遇到 0x47,并且在 188 字节之后,没有另一个 0x47。它不是同步字节。接下来它等待 PAT 或 PMT,因为这些数据包具有校验和。因此,如果校验和匹配,并且每 188 字节有一个 0x47,则流被同步。意外发生的几率是天文数字。如果确实如此,最终在尝试解码流时会出现其他问题,并且该过程将重新开始。

以h.264为例。开始代码 000001 在流中不合法。如果编码器确实产生了这个字节序列,它会被转义为 00000301 并且解码器知道在 0000

之后忽略 03

首先,解析器应该为解码器识别一个合适的数据包边界以开始解码。解析器通过以下方式执行此操作:

  • 连续识别 3 个同步字 (0x47)。
  • 2个同步字之间的距离是188字节。

如果满足以上 2 个条件,解析器将假设一个正确的数据包边界。

请更正或更新。