Поиск пакетов mpeg 2 в Matlab с помощью fread

Я использовал анализатор ts для файла .ts, который у меня есть с кодеком mpeg-2, и обнаружил, что он разбивается на 7311 пакетов. Я пытаюсь найти это через Matlab, используя fopen, чтобы открыть файл ts в двоичном формате, и fread, чтобы прочитать файл, но все, что я получаю, - это столбец с огромной коллекцией чисел (намного выше количества пакетов). Кто-нибудь знает, как я могу определить, какие из этих данных являются пакетами? Или, если кто-то знает другой способ найти пакеты, мне это очень поможет. заранее спасибо


person user2377250    schedule 13.05.2013    source источник


Ответы (1)


Если погуглить, формат транспортного потока MPEG-2 (ts) состоит из пакетов длиной 188 байт, каждый из которых имеет 4-байтовый заголовок, за которым следует 184-байтная полезная нагрузка. По сути, вы можете подсчитать количество пакетов, подсчитав количество найденных вами заголовков, но имейте в виду, что если вас интересует только подсчет количества, например, видеопакетов в потоке, вам потребуется более глубокий анализ заголовки, потому что поток может содержать любое количество чередующихся «элементарных потоков» (которые могут быть видео, аудио или произвольными данными). Каждый элементарный тип пакета в потоке обозначается уникальным «PID», который содержится в заголовке.

Помимо вышеперечисленного, вам также придется обрабатывать синхронизацию — каждый заголовок начинается с «байта синхронизации», который имеет значение 0x47 (или 01000111 в двоичном формате). Согласно этого ресурса, декодеры начинают с поиска этого байта синхронизации; как только они его найдут, они могут найти заголовок пакета. Чтобы убедиться, они пытаются найти три последовательных байта синхронизации (в потоке их разделяет 188 байтов); если найдено три, может произойти синхронизация, и с этого момента границы пакетов могут приниматься с интервалом в 188 байт. Обратите внимание, однако, что следует проверить первый байт каждого предполагаемого заголовка, чтобы определить, является ли он байтом синхронизации. Если это не так, то это называется «потерей синхронизации», и процесс синхронизации должен начаться снова.

Когда у вас есть некоторый код для синхронизации с потоком, должно быть довольно легко извлечь PID из заголовка каждого пакета и подсчитать количество пакетов, связанных с каждым найденным уникальным PID. Возможно, вам следует также проверить первый бит после байта синхронизации, так как если он равен 1, это указывает на ошибку транспорта, а полезная нагрузка пакета недействительна. Подробную информацию о формате заголовков пакетов можно найти здесь.

person wakjah    schedule 13.05.2013