определять типы видеокадров в потоке MPEG TS

Я пытаюсь извлечь информацию о типах кадров в TS-пакетах. Используя FFMEPG, я отправляю инкапсулированное видео MPEG TS (сжатое с помощью x264), а с другой стороны я записываю полученные пакеты с помощью Wireshark. Мои пакеты имеют длину 188 байт, что соответствует одному пакету MPEG TS. Теперь мне нужно выяснить, какие пакеты TS несут данные кадров I, P или B.

Я попытался обнаружить заголовок изображения в своих данных (00 00 01 00), основываясь на этом сообщении: http://forum.digital-digest.com/f4/help-extract-i-frames-mpeg2-ts-89736.html, но я не смог Найди это. Все, что я могу зарегистрировать, это начало пакета PES (00 00 00 01 E0). Я совсем запутался в форматах. В какой части PES указано, какой тип кадра передается в одном пакете TS?

Спасибо.


person stani    schedule 24.08.2012    source источник
comment
Удалось ли вам использовать ffprobe для этого?   -  person av501    schedule 29.08.2012
comment
Обнаружить код начала кадра в ts-пакете непросто. Во-первых, может произойти эмуляция стартового кода (например, в разделе приватных данных заголовка PES). Более того, начальный код может быть разбит между двумя ts-пакетами, например «00 00» — это конец первого ts-пакета, а «01» — начало данных ts-пакета.   -  person Shevach Riabtsev    schedule 18.12.2017
comment
Вы можете попробовать использовать: github.com/tsduck/tsduck   -  person Pierz    schedule 30.07.2020


Ответы (1)


Просто сохраните весь свой контент в форме ts и запустите поверх него ffprobe.

ffprobe -show_frames и найдите pict_type в видеокадрах. Напишите небольшой скрипт для анализа вывода и предоставления вам вывода. Если вам лень это делать

ffprobe -show_frames | grep тип_пикта | grep -n I
должен дать вам номера кадров напрямую.

будет работать для любого формата, если это допустимый видеофайл.

person av501    schedule 26.08.2012
comment
забыл упомянуть, что ffprobe является частью утилиты ffmpeg - person av501; 26.08.2012
comment
Большое спасибо за ваш ответ. Я пытался использовать ffprobe, как вы предложили (используя параметр -show_frames), но он дает мне информацию о каждом кадре, и мне нужна информация о том, какие данные типа кадра хранятся в каждом пакете. Использование опции -show_packet не дает никаких сведений о том, относятся ли данные в пакете к типу кадра I, P или B. - person stani; 29.08.2012
comment
Вы можете соотносить пакеты с кадрами. Напишите небольшой скрипт, который сделает это за вас! Также будучи транспортным потоком, каждый пакет будет иметь размер 188 байт. Таким образом, из ffprobe вы можете получить размер кадра для каждого кадра. теперь у вас есть способ сопоставить их напрямую, потому что вы знаете, что размер каждого кадра и размер пакетов равен 188. Помните, что пакеты дополняются до 188 байт, когда нет данных кадра [кадр заканчивается раньше конца пакета], поэтому начинаются новые кадры. на новых пакетах. - person av501; 29.08.2012
comment
Я также пытался использовать анализатор пакетов MPEG2-TS 2.4.1.2 (с www.pjdaniel.org.uk/mpeg/), и он считывал заголовок PES, но не мог найти заголовок изображения — выдавал: Видеопоследовательность Последовательность код заголовка не найден в этом пакете AFD не найден в этом пакете. Как тогда декодер (или ffprobe) узнает, какие данные типа кадра содержит каждый пакет? - person stani; 29.08.2012
comment
Понимаю. Это кажется трудным способом сделать это, но это выполнимо. Я хотел сделать это, читая пакет за пакетом, потому что позже я хотел поэкспериментировать со случаями, когда я намеренно отбрасываю часть пакетов и посмотреть эффект от отбрасывания пакетов до качества видео. Спасибо. - person stani; 29.08.2012