Mpeg2 ts байт синхронизации и ошибка непрерывности
У меня есть проект, и я должен написать анализатор файлов TS. Парсер должен прочитать файл ts и вывести некоторые данные из заголовков каждого пакета файла. Два из выходных данных, которые я должен напечатать, - это, если есть ошибки синхронизации (и сколько), и ошибки счетчика непрерывности числа.
Сначала об ошибке синхронизации. Я знаю, что первый байт пакета относится к байту синхронизации. Итак, у нас есть ошибка синхронизации, если байт синхронизации пакета не имеет значения 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), если пакет содержит полезную нагрузку (которая может быть определена с помощью флагов compatibility_field_control). Таким образом, вам нужно будет отслеживать значения CC для каждого PID отдельно. Если в значениях CC есть разрыв, например, CC = 7 следует после CC = 5, это ошибка CC. Особое внимание должно быть уделено повторным значениям CC. Значение CC может повторяться один раз, например, CC = 5 в двух последовательных пакетах TS (с одинаковым PID). Если значение CC повторяется более двух раз, это также является ошибкой CC.
Обратите внимание, что нулевые пакеты (PID = 0x1FFF = 8191) не вносят вклад в ошибки CC, поскольку значение их поля CC не определено (стандарт допускает произвольные значения CC в случае нулевых пакетов).
Другое исключение - когда установлен флаг distinuity_indicator, тогда значение CC может измениться на произвольное значение, и это не считается событием ошибки CC.
Возможно, вы захотите взглянуть на ETSI ETR 290, который определяет некоторые рекомендации по измерению для систем DVB. Среди прочего есть некоторые советы о том, как считать ошибки CC.
Я испытал системные потоки MPEG, где присутствуют разрывы между TS-пакетами. Стоит отметить, что промежутки имеют очень специфическую форму, все промежутки заполнены байтами, равными текущей длине промежутка. Например, если промежуток имеет длину, равную 4, присутствует следующий шаблон 04 04 04 04 47 ... Проигрыватель VLC воспроизводит такие потоки без сообщенных или наблюдаемых ошибок. Строго говоря, это ошибка синхронизации.
если вы возьмете совместимый системный поток mpeg и вставите, скажем, следующий байт '04 04 04 04'между двумя последовательными ts-пакетами, даже если ffmpeg / ffplay не распознает эти данные заполнения как ошибку синхронизации, используйте' ffmpeg -i -f null / dev / null '
ffmpeg имеет встроенный автоопределение FEC (шаблоны FEC могут быть присоединены в конце некоторых или всех ts-пакетов). Поэтому ffmpeg пропускает данные вставки между ts-пакетами, если длина данных вставки не меньше предварительно определенного порогового значения.