Кодирование видео с чередованием (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 типа контента может привести к сбою кодировщика. Задайте кодировщик для кодирования с чередованием, только если у вас есть примеры для доставки.
Связанные темы