Типы видео 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 не охватывают примеры. Это позволяет декодеру восстанавливать данные после повреждения данных или удаления примеров.
Что заставляет кодировщик часто генерировать SPS\PPS?
Хочу записывать mp4 из webrtc стрима. Проблема в том, что кодировщик chrome почему то слишком часто (с каждым IDR) посылает ещё и SPS\PPS пакеты. Парсил и сравнивал эти SPS\PPS, они все одинаковые (за исключением битов выравнивания в конце rbsp_alignment_zero_bit). Разрешение в потоке идет постоянное, не изменяется
Смотрел другие видео, везде SPS посылается один, в начале видео. В моем же случае они сыпятся с каждым IDR
Вот примерный порядок NAL (вырезал nal_unit_type=1, т.к. их слишком много)
nal_unit_type 00111 = 7 (SPS) nal_unit_type 01000 = 8 (PPS) nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 (IDR) nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7 nal_unit_type 01000 = 8 nal_unit_type 00101 = 5 nal_unit_type 00111 = 7
Последовательность такая SPS PPS IDR, SPS PPS IDR, SPS PPS IDR. Ничего не понимаю, зачем слать каждый раз SPS, если он не меняется. Что ещё может меняться в стриме, что заставляет кодировщик слать эти SPS?
Не охота пока дебажить хром, может кто подскажет куда копать )
H264 с несколькими PPS и SPS
У меня есть карта, которая производит поток H264 с SPS (Набор последовательных параметров) и PPS (Набор параметров картинки), в таком порядке, непосредственно перед каждым I-фреймом. Я вижу, что большинство потоков H264 содержат PPS и SPS в первом I-фрейме.
Это рекомендуется? Обычно ли декодеры/максинаторы поддерживают несколько PPS и SRS?
Поделиться Источник 19 декабря 2013 в 12:51
3 ответа
H.264 поставляется в различных форматах потоков. Один из вариантов называется «Приложение B».
Обычно вы видите SPS/PPS перед каждым I-фреймом и PPS перед другими срезами.
Большинство декодеров/муксеров довольны «Приложение B» и повторением SPS/PPS.
Большинство декодеров/муксеров не сделают ничего значимого, если вы измените формат и SPS/PPS в середине потока.
Большинство декодеров/муксеров разбирают первый SPS/PPS в процессе настройки и игнорируют последующие SPS.
Некоторые декодеры/муксеры предпочитают H.264 без (AUD), кодов запуска и SPS/PPS. Затем вам нужно передавать SPS/PPS вне полосы в рамках настройки декодеров/муксеров.
Поделиться 19 декабря 2013 в 16:03
Картинка IDR или I-slice не может быть декодирована без SPS и PPS. В случае контейнера, такого как mp4, SPS и PPS хранятся вдали от видеоданных в заголовке файла. После воспроизведения mp4 разбирается, SPS/PPS используется для настройки декодера AVC один раз, затем видео может воспроизводиться снова, начиная с любого IDR/I-slice.
Существует второй сценарий, живое видео. С живой видео нет заголовка файла, потому что файла нет. Поэтому, когда телевизор настраивает на канал, откуда он получает SPS/PPS? Потому что телевизор транслируется, то есть телевизор не имеет возможности запросить SPS/PPS, он повторяется в потоке.
Так что, когда вы начинаете кодировать видео, ваш кодер не знает, что вы собираетесь делать с видео. Теперь, если дополнительные SPS/PPS отображаются в mp4, декодер просто игнорирует их, но если вы передаете потоковую передачу на телевизор, без них поток никогда не будет воспроизводиться. Поэтому большинство по умолчанию повторяют SPS/PPS на всякий случай.
Поделиться 19 декабря 2013 в 19:13
Я знаю о спецификации matroska (mkv), поэтому здесь SPS и PPS хранятся только один раз в виде частного раздела данных кодека. Поэтому они не повторяются с каждым i-фреймом или IDR-фреймом.
Если каждый i-фрейм/IDR-фрейм вашего потока h264 имеет SPS/PPS, то матросский мукер будет хранить только 1 копию в частных данных кодека.
Таким образом, при хранении формата контейнера на основе использования используется только одна копия SPS/PPS, но трансляция и потоковые форматы контейнера предлагают отправлять SPS/PPS перед каждым i-фреймом/IDR-фреймом или при любых изменениях кодека в потоке h264 в это время
Как правильно P.S.S или P.P.S?
Наверное, каждый замечал, что кто-то пишет P.S.S, а кто-то P.P.S,так вот: P.S. значит «post scriptum», «после написанного».
P.P.S. значит «post post scriptum», «после написанного после»
P.S.S. значит «post sub scriptum», «после того, что ниже написанного», синоним P.P.S.
Надеюсь, чем-то Вам помог)

8 лет назад
Бред.
P.S.S. в значении «после того, что ниже написано» смысла не имеет.
Есть малоприменяемая расшифровка P.S.S. = «post super scriptum» = «после написанного выше», но она синонимична обычному P.S.
Поэтому только так : P.S. , P.P.S , P.P.P.S ит.д.
раскрыть ветку
8 лет назад
Дальше P.S. мне еще заходить не приходилось.
раскрыть ветку
8 лет назад
А я пишу З.Ы., З.З.Ы. и З.Ы.Ы. .
раскрыть ветку
8 лет назад
s.p.s — это зпасибо. не благодарит.
раскрыть ветку
8 лет назад
Спасибо большое, всегда думал что P.S.S. пишут неграмотные, и правильный единственно верный P.P.S. и т.д. Развеял мой мрак)
Лучшие посты за сегодня
17 часов назад
Кулинарный батл
Всем привет. Сидели мы и болтали с @Moderator812, и как то наш диалог зашёл до приготовления еды. Мы оба любители покушать ну и поготовить, естественно. Слово за слово и мы как то решили устроить кулинарный батл. Суть его такова:
-4 часа на приготовление
-количество блюд не ограничено, сложность блюда не ограничена, ингредиенты любые
-наше жюри — пользователи Пикабу
-в условиях обязательное наличие поста от своего аккаунта.
Победитель получает ящик пива за счет проигравшего.
И так, у нас нет ограничений по закупке по ингредиентам, но я решил использовать то что у меня есть в наличии и не бегать за ними в магазин. Решено было приготовить то, что я обычно ем. 3 блюда:
1) Рыба в соусе бешамель с гарниром из фасоли
2) Солянка по-домашнему
3) Закуска из грибов по-корейски
Начал я с приготовления рыбы, так как это занимает меньше всего времени.
Готовится всё просто. Чеснок обжарен на сливочном масле, добавил ложку муки, слегка обжарил и начал вливать молоко, одновременно помешивая венчиком. Добавил для аромата прованские травы.
Тем временем (в моём случае это был минтай в «брикетах») начал обжаривать рыбу. По 5 минут с каждой стороны. Затем влил бешамель и пару минут дал потушиться.

Далее готовилось сразу несколько блюд
Копченные ребра отправил на варку, добавив пару листочков лаврушки. Одновременно начал тушить огурцы (порублены брусочком, далее чуть позже добавлены в ту же ёмкость лук полукольцами и пару ложек томатной пасты)
Грибы для закуски были порублены и отправлены для бланшировки.
Ну и на последней четвертой конфорке готовился гарнир для нашего первого блюда — фасоль, морковь и чуточку чесночка для вкуса.

Гарниру к первому блюду готовиться было совсем не много, поэтому я переключился на закуску.
Откинул на дуршлаг грибы и оставил остывать. Тем временем порезал свежий болгарский перец (он был у меня заморожен изначально), спассировал лук, нарубил чесночка и бросил в миску. Заправил её двумя столовыми ложками уксуса, столовой ложкой рыбного соуса, ложкой молотого кориандра, щепоткой острого перца и щепоткой магии глутамата натрия. Добавил грибочков, горсточку чеснока и залил кипящим маслом

На этом с закуской закончил, перешёл к основному блюду сегодняшнего дня.
С солянкой всё на самом деле было просто. Доготовить бульон на копченных ребрах, потушить огурцы, добавить разные виды мяса и (о боже!) картошку. У меня он состоял из четырёх видов мяса. Небольшие куски говядины и курицы (по 100 грамм) у меня оставались в закромах, копченная свининка уже доваривалась, ну и осталось только порезать копченную колбаску.
Когда я открывал маслины\оливки, внезапно оказалось что они с косточками, поэтому приходилось их очищать (не делайте так, покупайте без косточек). Пару взмахов половником и блюдо было готово.
Теперь показываю вам все итоговые результаты.

И так. Я надеюсь вам понравилось то что я приготовил.
Ставьте, пожалуйста, плюсы мне, если вы считаете что я более достоин ящика пива.
В случае победы, обещаю бросить вызов другим модераторам (а может даже и админу)
Пост моего соперника — Модераторское хрючево
UPD:
Подведение итогов батла в 29.01 в 10.30 (по мск)