Декодировать один (H264) пакет, выгруженный ffmpeg из файла mp4 - PullRequest
1 голос
/ 04 апреля 2019

Я использовал ffmpeg, чтобы выгрузить пакет, представляющий один кадр из видео h264 внутри mp4

ffmpeg -i video.mp4 -c copy -vframes 1 -map 0:v:0 -f data frame.bin

Данные внутри frame.bin кажутся в порядке и, кажется,состоит из тех же байтов, что и первый кусок / пакет (я не уверен, что является правильным термином) атома mdat.

Теперь я хочу декодировать этот кадр.Так как я знаю кодек, который использовался для создания этого пакета (h264), я подумал, что мог бы просто подготовить контекст кодека, загрузить все эти данные в пакет и использовать традиционный avcodec_send_packet(codecContext, packet), за которым следует avcodec_receive_frame() combo.

К сожалению, вызов avcodec_send_packet завершается неудачно, и я получаю следующую ошибку

(-1094995529) Invalid data found when processing input

Поскольку первые 4 байта данных пакета - это размер пакетаСам я пытался пропустить эти байты перед передачей буфера в пакет, но это также не удалось.

Я пропускаю какой-то шаг или что-то не так?Возможно ли то, что я пытаюсь сделать?(скажите, пожалуйста:)

1 Ответ

1 голос
/ 04 апреля 2019

Рек. МСЭ-Т H.264 и приложение B

Рекомендация H.264 - это стандарт видеокодеков, определенный Международным союзом электросвязи, T Сектор стандартизации электросвязи (ITU- T ). Он доступен бесплатно и можно загрузить с их сайта .

Стандарт определяет формат потока байтов, самым низким уровнем абстракции которого является NALU (блок абстракции сетевого уровня).

Может существовать 32 типа NALU, хотя около 11 зарезервированы или не используются. Некоторые несут данные фрагмента видео, некоторые нет. Два типа NALU будут важны позже в этом обсуждении: SPS (набор параметров последовательности) и PPS (набор параметров изображения). И то, и другое требуется для декодирования фрагмента видео и предоставления важной информации о потоке, такой как его размер и интерпретация необработанных данных.

H.264 оставляет неопределенным, как эти NALU транспортируются и создаются. Тем не менее, она описывает одну возможную схему в собственном Приложении В. Стандарта. При отсутствии более подходящего названия эта схема обычно называется Приложение B .

Схема заключается в добавлении префикса NALU к легко запускаемому синхронизирующему коду, который не может быть в пределах NALU: 3- или 4-байтовый шаблон 00 00 01 или 00 00 00 01. Остальная часть NALU тогда следует. Эта схема популярна в аппаратных и / или потоковых ситуациях, потому что она позволяет легко получить битовую блокировку и байтовое выравнивание, периодически отправляет SPS / PPS «в полосе» и, таким образом, позволяет настраиваться на поток в произвольной точке, чтобы начать декодирование, и имеет интересное свойство, заключающееся в том, что между NALU можно достоверно отправить произвольное число 0 битов или байтов.

ISO / IEC 14496 MPEG-4 и AVCC

MPEG-4 - это семейство из нескольких «частей» стандартов для кодирования и хранения аудио-видео, созданных совместной группой Международной организации по стандартизации (ISO) и Международной электротехнической комиссии (IEC), называемой Группой экспертов по движущимся изображениям ( MPEG). Несколько частей только семейства MPEG-4 имеют отношение:

  • MPEG-4, часть 10 / Расширенное кодирование видео (AVC), технически идентичное ITU-T H.264. Бесплатно .
  • MPEG-4, часть 12, Базовый формат медиафайлов ISO (BMFF), определяет общий формат файла двоичного контейнера, который может быть специализированным. Бесплатно .
  • MPEG-4 Part 14 (MP4), который специализируется на части 12 для видео в целом и определяет расширение и формат файла .mp4. Эта часть является очень дорогой ( 88 швейцарских франков ) и недоступна для общественности.
  • MPEG-4 часть 15, которая определяет, как видеоданные, структурированные NALU, такие как видео часть 10 / H.264, хранятся в части 12 ISO BMFF. Эта часть является чрезвычайно дорогой ( 198 швейцарских франков ) и недоступна для широкой публики, но она, части 14, 12 и 10, является основой широко используемого .mp4 контейнер с H.264-кодированным видео.

AVCC

К сожалению, Часть 15 также является частью, которая определяет новую схему для формирования NALU. Эта схема предлагает извлечь все NALU SPS / PPS в «внеполосную» структуру, называемую AVCC , а также разделить и заменить префиксы начального кода перед NALU на (почти всегда) 4 -байтовое число, представляющее размер в байтах следующего NALU.

Эта схема популярна для быстрого и случайного поиска по видеоданным, и, собрав все данные конфигурации видеодекодера (SPS / PPS) в одном стандартизированном месте, можно настроить видеодекодер один раз в начале, а затем не беспокоиться о неожиданных неожиданностях, таких как динамическое изменение размера видеокадра (что позволяет Приложение B).

К счастью, намеки на структуру AVCC существуют онлайн, как и код для перевода между AVCC и Приложением B.

Ваши потребности

Кажется, вам нужно преобразовать AVCC -> Приложение B. Это можно сделать с помощью фильтра битового потока FFmpeg, h264_mp4toannexb:

ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts
...