MPEG-TS PSI парсинг
Я пытаюсь построить разделы таблицы EIT, как указано в EN 300 468. Я успешно проанализировал пакеты в структурах данных (в Java) и могу получить доступ к полезной нагрузке каждого пакета.
Я не понимаю, как раздел таблицы разделен по пакетам, спецификация слегка запутанная / неопределенная. Каков процесс, если предположить, что можно отфильтровать поток пакетов TS по PID, чтобы построить такую таблицу?
Я понимаю payload_unit_start_indicator
будучи установленным, указывает, что первый байт поля полезной нагрузки является указателем на первый байт новой секции, является ли это смещением от начала полезной нагрузки?
Если, например, я получаю пакет TS и идентифицирую его как начало раздела, то должен ли я считывать байты в массив, определять длину раздела из заголовка и затем продолжать заполнять мой массив все большим количеством полезных нагрузок пакета TS одного и того же PID до bytesRead == sectionLength
?
Спасибо за чтение, любой совет или помощь будет очень цениться!:)
2 ответа
Здесь вы можете визуализировать структуру транспортного пакета (TP).
Каков процесс, если предположить, что можно отфильтровать поток пакетов TS по PID, чтобы построить такую таблицу?
Ну ты в значительной степени прибил это
Чтобы построить раздел из потока, вы должны накапливать TP из одного и того же PID. Как вы уже догадались payload_unit_start_indicator
указывает на начало нового раздела. Однако это не смещение.
Тогда, как вы сказали, вы просто должны продолжать собирать полезные данные TP одного и того же PID до 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.
Таким образом, начало раздела на самом деле является смещением от полезной нагрузки:
uint8_t* section_start = payload + *payload + 1