我正在尝试构建en300 468中指定的EIT表部分。我已经成功地将数据包解析为数据结构(在Java中),并且可以访问每个数据包的有效负载。
我不明白表部分是如何在包之间分割的,规范有点混乱/不确定。假设可以通过PID过滤TS数据包流来构建这样一个表,该过程是什么?
我理解payload_unit_start_indicator
被设置,表明有效载荷字段的第一个字节是指向新节的第一个字节的指针,是有效载荷开始的偏移量吗?
如果例如我收到一个TS数据包,并且我将其识别为一个部分的开始,那么我是否将字节读取到数组中,从头中确定部分长度,然后继续用越来越多的相同PID的TS数据包有效载荷填充我的数组,直到bytesRead == sectionLength
?
感谢您的阅读,任何建议或帮助都将非常感激!:)
在这里您可以看到传输数据包 (TP)的结构。
过程是什么,假设一个TS数据包流可以通过
你说的很对:
要从流中构建一个区段,必须从相同的PID中累积tp。正如您所猜测的,payload_unit_start_indicator
表示新部分的开始。然而,不是偏移量。
那么就像你说的,你只需要继续收集相同PID的tp的有效负载,直到payloadBytesRead == sectionLength
。
Transport Packets (188 bytes each):
---------------------------
|Header| Payload1 | TP1: payload_unit_start_indicator = 1
---------------------------
^
0x47 (Sync Byte)
---------------------------
|Header| Payload2 | TP2: payload_unit_start_indicator = 0
---------------------------
...
Section (sectionLength):
--------------------------------------- ---------------------
| Payload1 | Payload2 | ...| Payload N |
--------------------------------------- ---------------------
来自en300 468规范:
节可以从TS包的有效负载开始,但是这不是必需的,因为在第一部分的开头TS报文的有效载荷由pointer_field指定。
section的起始点实际上是有效载荷的偏移量:
uint8_t* section_start = payload + *payload + 1