3

我正在尝试构建EN 300 468中指定的 EIT 表部分。我已经成功地将数据包解析为数据结构(在 Java 中),并且可以访问每个数据包的有效负载。

我不明白表格部分是如何在数据包中拆分的,规范有点混乱/不确定。假设可以通过PID过滤TS数据包流,构建这样一个表的过程是什么?

我了解payload_unit_start_indicator正在设置,表示有效负载字段的第一个字节是指向新部分第一个字节的指针,这是从有效负载开始的偏移量吗?

例如,如果我收到一个 TS 数据包,并且我将其标识为一个部分的开头,那么我是否将字节读入一个数组,从标题中确定部分长度,然后继续用越来越多的 TS 数据包有效负载填充我的数组相同的 PID 直到bytesRead == sectionLength?

感谢您的阅读,任何建议或帮助都将不胜感激!:)

4

2 回答 2

3

在这里,您可以可视化传输数据包(TP) 的结构。

假设可以通过PID过滤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    |
---------------------------------------    ---------------------
于 2014-08-11T07:38:32.787 回答
0

从 en300 468 规范:

段可以从 TS 包的有效载荷的开始处开始,但这不是必需的,因为 TS 包的有效载荷中的第一个段的开始由 pointer_field 指向。

所以部分开始实际上是从有效负载的偏移量:

uint8_t* section_start = payload + *payload + 1
于 2014-12-17T12:04:15.770 回答