我正在尝试构建EN 300 468中指定的EIT表部分。我已经成功地将数据包解析为数据结构(在Java中),并且可以访问每个数据包的有效负载。
我不明白表格部分是如何在数据包中拆分的,规范有点混乱/不确定。 假设可以通过PID过滤TS数据包流来构建这样的表,那么进程是什么?
我理解正在设置的payload_unit_start_indicator
,表示有效负载字段的第一个字节是指向新节的第一个字节的指针,是指从有效负载的起始点开始的偏移量吗? / em>的
例如,如果我收到一个TS数据包,并将其识别为部分的开头,那么我是否将字节读入数组,从头部确定部分长度,然后继续填充我的数组越来越多直到bytesRead == sectionLength
的相同PID的TS数据包有效负载?
感谢阅读,任何建议或帮助都将非常感谢! :)
答案 0 :(得分:3)
Here您可以看到传输数据包(TP)的结构。
假设可以过滤TS数据包流,该过程是什么 PID,构建这样的表?
嗯,你几乎钉了它:
要从流构建节,您必须从相同的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 |
--------------------------------------- ---------------------
答案 1 :(得分:0)
来自en300 468规范:
段可以从TS包的有效载荷的开始处开始,但是 这不是一个要求,因为第一节的开头 指针的有效载荷由pointer_field指向。
因此,节开始实际上是与有效载荷的偏移:
uint8_t* section_start = payload + *payload + 1