2016-03-13 4 views
1

У меня есть проект, и я должен написать синтаксический анализатор ts. Парсер должен прочитать ts-файл и вывести некоторые данные из заголовков каждого пакета файла. Два из выходов, которые я должен распечатать, являются, если есть ошибки синхронизации (и сколько) и ошибки счетчика непрерывности числа.Mpeg2 ts sync byte и ошибка непрерывности

О ошибке синхронизации. Я знаю, что первый байт пакета относится к байту синхронизации. Итак, у нас есть ошибка синхронизации, если байт синхронизации пакета не имеет значения 0x47, как и должно быть? Итак, если в файле 100 пакетов, а 30 байтов синхронизации «плохо», есть 30 ошибок синхронизации?

Об ошибке счетчика непрерывности, я хотел бы, чтобы кто-то объяснил, как найти, есть ли ошибка непрерывности в простых словах, поскольку стандарт mpeg2, который я прочитал, мало чем помог. Спасибо

ответ

2

Ошибка байта синхронизации, когда первый байт пакета TS не содержит значения 0x47. В этом контексте может быть целесообразным поддерживать разные длины пакетов TS. Обычно пакет TS имеет длину 188 байтов, но вы можете столкнуться с разной длиной пакета, например. если была добавлена ​​защита от ошибок Рида-Соломона, пакет TS составляет 204 байта.
Стандарт ISO 13818-1 довольно ясен и недвусмыслен относительно того, что такое ошибка непрерывности (CC). Проще говоря, каждый TS-пакет содержит 13-битное поле идентификатора PID (идентификатор пакета) и 4-битное поле CC (непрерывность). Последовательные пакеты в же PID должен содержать приращением значения CC (по модулю 16, так что после CC = 15 следует CC = 0) , если пакет содержит полезную нагрузку (что может быть определено из adaptation_field_control флагов). Таким образом, вам нужно будет отслеживать значения CC для каждого ПИД отдельно. Если есть пробел в значениях CC, например. CC = 7 следует после CC = 5, это CC ошибка. Особое внимание следует уделять повторным значениям CC. Значение CC может повторяться один раз, например. CC = 5 в двух последовательных пакетах TS (с одинаковым PID). Если значение CC повторяется более двух раз, это также является ошибкой CC.
Обратите внимание, что пустые пакеты (PID = 0x1FFF = 8191) не вносят вклад в ошибки CC, так как значение их поля CC не определено (стандарт допускает произвольные значения CC в случае нулевых пакетов).
Другим исключением является то, что установлен флаг discontinuity_indicator, тогда значение CC может измениться на произвольное значение, и это не считается событием ошибки CC.

Возможно, вы захотите взглянуть на ETSI ETR 290, который определяет некоторые рекомендации по измерению для систем DVB. Среди прочего есть некоторые подсказки о том, как считать ошибки CC.

0

Я испытал системные потоки mpeg, где присутствуют промежутки между ts-пакетами. Стоит заметить, что пробелы имеют особую форму, все пробелы заполняются байтами, равными текущей длине пробела. Например, если зазор имеет длину, равную 4, присутствует следующий шаблон 04 04 04 04 47 ... VLC-плеер воспроизводит такие потоки без зарегистрированных или обнаруженных ошибок. Строго говоря, это ошибка синхронизации.

если вы берете поток системы MPEG-совместимый и вставить сказать следующему шаблон BYTE '04 04 04 04' между двумя последовательными TS-пакетами, даже FFmpeg/ffplay не признает эту начинку данных в виде синхроимпульса ошибки, используйте ' ffmpeg -i -f null/dev/null '

ffmpeg имеет встроенное автоопределение FEC (шаблоны FEC могут быть прикреплены в конце некоторых или всех ts-пакетов). Поэтому ffmpeg пропускает данные наложения между ts-пакетами, если длина данных набивки меньше заранее определенного порога.