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


Кодирование видео с чередованием (Microsoft Media Foundation)

Видеоданные, предназначенные для использования с компьютерами, обычно являются прогрессивными, то есть каждый кадр кодируется как одно изображение. Некоторые устройства, например телевизоры, отображают не кадр сразу, а в виде двух изображений. Одно из изображений или полей содержит все четные строки. Другое поле содержит данные для всех нечетных строк. Видео, закодированное с несколькими полями на кадр, называется чередованием, так как оно отрисовывается путем переключения между четным и нечетным полями.

В прошлом перед кодированием с помощью кодека Windows Media Video всегда чередовалось видеосодержимое. Однако начиная с Windows Media 9 Series кодировщик видео поддерживает сжатие чередующегося содержимого без предварительного преобразования его в прогрессивный. Сохранение переплетения в закодированном файле важно, если содержимое когда-либо отображается на экране с чередованием, например на телевизоре. Эта функция имеет все большее значение, так как поддержка содержимого на основе Windows Media распространяется на DVD-проигрыватели, set-top boxs и другую домашнюю электронику.

Самый простой способ кодирования и доставки видео с чередованием — разработка приложения с помощью пакета SDK для форматов Windows Media и хранение содержимого в ASF-файлах. Чередующаяся информация о кадрах передается в кодек с помощью расширений единиц данных, которые хорошо работают для содержимого ASF, но немного сложнее поддерживать в других контейнерах. Дополнительные сведения о модулях обработки данных см. в разделе Использование модулей обработки данных.

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

Чередование видео и кодировщик

Первым шагом в кодировании видео с поддержкой чередованием является настройка кодировщика для кодирования чередующихся полей. Для этого присвойте свойству MFPKEY_INTERLACEDCODINGENABLED значение TRUE. Это подготавливает кодировщик к получению примеров с чередованием. Каждый входной пример должен содержать оба поля.

Каждый пример, обрабатываемый с помощью кодировщика после активации чередующейся кодировки, должен иметь присоединенное расширение единицы данных. Предполагается, что примеры без ожидаемого расширения единиц данных являются прогрессивными. Идентификатор GUID, определяющий расширение, — D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC. Значения, передаваемые объектами пакета SDK для формата Windows Media, определены в следующей таблице.

Значение Описание
0x00000020 Указывает, что пример сначала закодирован с помощью нижнего поля. Это значение имеет смысл только в сочетании с чередованием.
0x00000040 Указывает, что пример сначала кодируется с помощью верхнего поля. Это значение имеет смысл только в сочетании с чередованием.
0x00000080 Указывает, что образец чередуется. Это единственное значение, которое имеет смысл для МДО кодека.

 

Одно из первых двух значений всегда объединяется с 0x80 с использованием побитового или перед заданием в выборке. Однако кодировщик проверяет только 0x80 и игнорирует остальную часть расширения. Если расширение идентифицирует пример как чередование, кодировщик поддерживает чередование образца в сжатом потоке и внедряет в поток флаг индикации, чтобы декодер мог идентифицировать чередующиеся кадры. Каждый пример с чередованием помечается, чтобы исходное содержимое, представляющее собой сочетание прогрессивных и чередующихся элементов, можно было закодировать в поток вместе.

Объект модуля записи пакета SDK формата Windows Media включает расширения единиц данных типа контента в примерах, записываемых в раздел данных контейнера ASF для использования во время отрисовки.

Чтение и отрисовка видео с чередованием

Декодер идентифицирует примеры с чередованием на основе флага, установленного кодировщиком в потоке. По умолчанию декодер деинтерлейзирует примеры и предоставляет прогрессивные выходные данные. Приложение проигрывателя может настроить декодер для обработки выходных данных с сохранением чередованием, задав свойство MFPKEY_DECODER_DEINTERLACING .

Трудность при воспроизведении видео с чередованием возникает после того, как декодер доставляет примеры. Отрисовщик (видео карта или микросхема на устройстве) не может правильно отобразить видеосодержимое, не зная, какое поле является. В приложениях, использующих пакет SDK для формата Windows Media, расширение единицы данных типа контента извлекается из несжатых примеров и может быть передано на устройство.

При непосредственном использовании объектов кодека передача данных не выполняется автоматически. Необходимо реализовать поддержку расширения data-unit-extension как в объектах буфера, так и в контейнере, который используется для закодированного содержимого. Наиболее распространенные типы контейнеров мультимедиа (например, AVI) не поддерживают метаданные уровня выборки. Вы можете реализовать собственную систему для хранения данных в файле и связать их с отдельными примерами, но только настроенное средство чтения сможет получить их.

Примечание

Если задать для свойства MFPKEY_INTERLACEDCODINGENABLED значение TRUE, а затем не отправлять примеры с подключенным расширением data-unit типа контента может привести к сбою кодировщика. Задайте кодировщик для кодирования с чередованием, только если у вас есть примеры для доставки.

 

Работа с видео