Поделиться через


Типы видео H.264

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Для видео H.264 определены следующие подтипы мультимедиа.

Subtype FOURCC Описание
MEDIASUBTYPE_AVC1 'AVC1' H.264 bitstream без кодов запуска.
MEDIASUBTYPE_H264 'H264' H.264 bitstream с кодами запуска.
MEDIASUBTYPE_h264 'h264' Эквивалентно MEDIASUBTYPE_H264 с другим значением FOURCC.
MEDIASUBTYPE_X264 X264 Эквивалентно MEDIASUBTYPE_H264 с другим значением FOURCC.
MEDIASUBTYPE_x264 'x264' Эквивалентно MEDIASUBTYPE_H264 с другим значением FOURCC.

 

Идентификаторы GUID этих подтипов объявляются в wmcodecdsp.h.

Разница main между этими типами носителей заключается в наличии кодов запуска в битовом потоке. Если подтип MEDIASUBTYPE_AVC1, битовый поток не содержит кодов запуска.

H.264 Bitstream с кодами запуска

Битовые потоки H.264, передаваемые по воздуху, содержащиеся в программе MPEG-2 или транспортных потоках или записанные на HD-DVD, форматируются в соответствии с описанием в приложении B к ITU-T Rec. H.264. Согласно этой спецификации, битовый поток состоит из последовательности единиц уровня абстракции сети (NALU), каждый из которых имеет префикс с начальным кодом, равным 0x000001 или 0x00000001.

Если коды запуска присутствуют в битовом потоке, используется следующий тип носителя:

Метка Значение
Основной тип MEDIATYPE_Video
Подтипы MEDIASUBTYPE_H264, MEDIASUBTYPE_h264, MEDIASUBTYPE_X264 или MEDIASUBTYPE_x264
Тип формата FORMAT_VideoInfo, FORMAT_VideoInfo2, FORMAT_MPEG2Video или GUID_NULL

 

Если тип формата GUID_NULL, структура форматирования отсутствует.

Если битовый поток содержит начальные коды, достаточно любого из перечисленных здесь типов форматов, так как декодер не требует никаких дополнительных сведений для анализа потока. Битовый поток уже содержит все сведения, необходимые декодеру, а коды запуска позволяют декодеру найти начало каждого NALU.

Следующие подтипы эквивалентны:

H.264 Bitstream без кодов запуска

Формат контейнера MP4 хранит данные H.264 без начальных кодов. Вместо этого каждый NALU имеет префикс поля длины, которое дает длину NALU в байтах. Размер поля длины может отличаться, но обычно составляет 1, 2 или 4 байта.

Если коды запуска отсутствуют в битовом потоке, используется следующий тип носителя.

Метка Значение
Основной тип MEDIATYPE_Video
Subtype MEDIASUBTYPE_AVC1
Тип формата FORMAT_MPEG2Video

 

Блок форматирования является структурой MPEG2VIDEOINFO . Эта структура должна быть заполнена следующим образом:

  • hdr: структура VIDEOINFOHEADER2 , описывающая битовый поток. Таблица цветов после части BITMAPINFOHEADER структуры отсутствует, а значение biClrUsed должно быть равно нулю.
  • dwStartTimeCode: не используется. Задайте нулевое значение.
  • cbSequenceHeader: длина массива dwSequenceHeader в байтах.
  • dwProfile: указывает профиль H.264.
  • dwLevel: задает уровень H.264.
  • dwFlags: количество байтов, используемых для поля длины, которое отображается перед каждым NALU. Поле длины указывает размер следующего NALU в байтах. Например, если dwFlags равно 4, каждой naLU предшествует поле длиной 4 байт. Допустимые значения: 1, 2 и 4.
  • dwSequenceHeader: массив байтов, который может содержать набор параметров последовательности (SPS) и набор параметров рисунка (PPS).

Контейнер MP4 может содержать наборы параметров последовательности (SPS) или наборы параметров рисунка (PPS) в виде специальных единиц NAL в заголовках файлов или в отдельном потоке (отдельно от видеопотока). После установки формата тип носителя может указывать единицы NAL SPS и PPS в массиве dwSequenceHeader . Если cbSequenceHeader больше нуля, dwSequenceHeader — это начало массива байтов, содержащего NALU SPS и PPS, разделенных 2-байтовой длиной полей в порядке байтов сети (big-endian). Можно использовать как SPS, так и PPS, только один из этих типов или нет. Фактический тип каждого NALU можно определить, изучив nal_unit_type поле самого NALU.

При использовании этого типа мультимедиа каждый пример носителя начинается с начала NALU, а единицы NAL не охватывают примеры. Это позволяет декодеру восстанавливать данные после повреждения данных или удаления примеров.