Как найти строку SPS и PPS в кодеке H264 из mp4

Как вы все знаете, файл манифеста клиента Smooth Stream содержит атрибут CodecPrivateData в теге видео. Теперь, после моего первоначального исследования, я обнаружил, что эта строка формируется с использованием SPS и PPS, которые по сути являются единицами NAL.

Я ищу способ извлечь эту информацию из видео GOP, чтобы я мог использовать ее для создания файла манифеста и вручную заменять частные данные кодека.

По сути, я с нетерпением жду создания собственного приложения для создания плавного представления с использованием ffmpeg.


person Tarun    schedule 09.07.2013    source источник
comment
Просто чтобы уточнить, вы хотите использовать ffmpeg для извлечения SPS и PPS из контейнера .mp4 программно, или это одноразовое извлечение SPS/PPS из одного файла .mp4?   -  person Aki    schedule 10.07.2013
comment
ну, если честно, ffmpeg - это просто вариант, я был бы в порядке, если бы был доступен любой другой инструмент, который может помочь мне получить SPS/PPS из mp4. Что касается вашего вопроса, не уверен, правильно ли я его понимаю. Но я в любом случае согласен, мне просто нужно извлечь SPS и PPS из mp4   -  person Tarun    schedule 10.07.2013


Ответы (1)


Обратите внимание, что SPS/PPS хранятся отдельно от видеодорожки в файле mp4 в одном из глобальных заголовков (часть глобального заголовка avcC).

Вот формат: 8+ байт в соответствии с ISO/IEC 14496-10.

                 = long unsigned offset + long ASCII text string 'avcC'
                -> 1 byte version = 8-bit hex version  (current = 1)
                -> 1 byte H.264 profile = 8-bit unsigned stream profile
                -> 1 byte H.264 compatible profiles = 8-bit hex flags
                -> 1 byte H.264 level = 8-bit unsigned stream level
                -> 1 1/2 nibble reserved = 6-bit unsigned value set to 63
                -> 1/2 nibble NAL length = 2-bit length byte size type
                  - 1 byte = 0 ; 2 bytes = 1 ; 4 bytes = 3
                -> 1 byte number of SPS = 8-bit unsigned total
                -> 2+ bytes SPS length = short unsigned length
                -> + SPS NAL unit = hexdump
                -> 1 byte number of PPS = 8-bit unsigned total
                -> 2+ bytes PPS length = short unsigned length
                -> + PPS NAL unit = hexdump

Если вы просто хотите извлечь SPS/PPS из одного .mp4, вы можете использовать шестнадцатеричный редактор и получить SPS/PPS путем проверки на основе приведенных выше спецификаций формата MP4 (ищите строку «avcC», выполнив поиск в конце файла). ); а затем добавьте байты SPS/PPS в массив c-style для вашего использования.

В противном случае вы можете использовать ffmpeg вместе с утилитой h264bitstream для извлечения SPS/PPS. Сначала запустите ffmpeg в командной строке, чтобы извлечь поток h264:

ffmpeg -i my_funny_video.mp4 -vcodec copy -vbsf h264_mp4toannexb -an my_funny_video.h264

Затем запустите h264_analyze из утилиты h264bitstream:

h264_analyze my_funny_video.h264

который проведет подробный анализ вашего SPS/PPS и других NAL.

person Aki    schedule 10.07.2013
comment
Я не уверен, как я могу использовать ffmpeg для извлечения SPS/PPS? Будет огромной пользой, если вы сможете помочь и в этом? - person Tarun; 11.07.2013
comment
Также я могу отслеживать SPS и PPS с помощью C#, но после анализа я обнаружил, что длина строки PPS/SPS может варьироваться в зависимости от видео. Они следуют какой-либо схеме - person Tarun; 12.07.2013