2013-05-13 1 views
0

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

ответ

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^