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


Использование кодеков windows Media Codecs в DirectShow

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

Заметка

Если вы собираетесь использовать автономные кодеки с DirectShow, вероятно, вам следует использовать их только в качестве DMO. Другими словами, вы будете использовать интерфейс IMediaObject вместо IMFTransform.

 

WM Audio в файлах AVI

DirectShow можно использовать для кодирования потоков WMA в любом формате контейнера файлов, для которого используется фильтр мультиплексера. Однако интерфейсы аудио и видеокодека Windows Media не поддерживают WMA в файлах AVI, так как невозможно использовать фильтры воспроизведения DirectShow AVI по умолчанию для поддержания синхронизации аудио-видео в файле AVI с потоком WMA. Дополнительная информация представлена в разделе о хранении сжатых медиафайлов в AVI-файлах.

DMO аудиокодировщика выводит образцы различной длительности, даже в режиме постоянного битрейта. Поэтому лучше всего использовать форматы контейнеров файлов, использующие метки времени. Файлы AVI не предоставляют метку времени для каждого звукового образца или группы примеров. В DirectShow фильтр разделителя AVI производит метки времени для каждой группы примеров (каждый звуковой кадр) на основе значения nAvgBytesPerSec в структуре WAVEFORMATEX в заголовке потока AVI.

Предположение, лежащее в основе этого вычисления, заключается в том, что все звуковые образцы в потоке равны по длительности; однако образцы, выводимые DMO, не равны по длительности, поэтому временные метки, применяемые разделителем AVI, не являются точными. Таким образом, невозможно использовать любое приложение на основе DirectShow для воспроизведения AVI-файлов с аудио- и видеопотоками в синхронизации без модификации AVI Splitter или декодера звука DMO. Голосовой кодек Windows Media Audio 9 может работать в некоторых случаях, но даже он теряет синхронизацию после любой операции поиска, поэтому не может считаться жизнеспособным решением.

Если у вас есть кодировщик MP3, вы можете создать файлы AVI с помощью WMV и MP3 для аудиопотока. Такие файлы будут воспроизводиться и искать правильно в проигрывателе Windows Media и других приложениях на основе DirectShow, так как разделитель AVI содержит специальный код обработки для потоков MP3. Другой вариант — использовать несжатый звук PCM, хотя, очевидно, полученный размер файла будет гораздо больше, чем с сжатым звуковым потоком. Так как пример приложения DirectShow создает AVI-файлы, он не демонстрирует, как использовать DMO для аудиокодирования.

Однопроходная кодировка

Видеокодировщик DMO просто используется в DirectShow для двух режимов кодирования: CBR и VBR с управлением качеством. Если вы следуйте правильному порядку операций при построении графа фильтров, как показано в примере приложения, содержимое WMV достаточно просто поместить в файл AVI с помощью мультиплексера AVI и средства записи файлов.

Двухпроходная кодировка

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

Когда граф переходит в состояние исполнения для второго прохода, оболочка DMO устанавливает флаг НЕПРЕРЫВНОСТИ на первом образце, так как метка времени не совпадает с последней меткой времени на первом проходе. Когда DMO, который не был разработан для работы в DirectShow таким образом, получает флаг НЕПРЕРЫВНОСТИ, он выполняет очистку и теряет данные, сохраненные с первого прохода. Наилучшим решением для обхода этой проблемы будет создание пользовательского фильтра оболочки DMO, который не устанавливает флаг НЕПРЕРЫВНОСТИ, когда график перематывается после первого прохода. Пример видео для Windows (VfW) в этом пакете SDK демонстрирует, как выполнять двухпроходную кодировку.

Чередуемое содержимое

DMO-кодировщик WMV способен кодировать чересстрочное содержимое, сохраняя чересстрочную структуру, что полезно для контента, захваченного с телевизора и воспроизводимого на телевизоре. Однако не удается сохранить перемешивание с помощью оболочки DMO по умолчанию, так как этот фильтр не поддерживает INSSBuffer на входных примерах.

DMO использует этот интерфейс для получения чересстрочных настроек для каждого получаемого им образца. Если интерфейс не найден, как и в случае с оболочкой DMO, DMO просто обрабатывает входные образцы как неинтерлакированные. Для выполнения интерлейсного кодирования в DirectShow существует несколько альтернатив. Самый простой подход, вероятно, заключается в том, чтобы использовать SDK Windows Media Format 9 Series либо напрямую, либо с помощью фильтра DirectShow записи WM ASF, чтобы создать чересстрочный ASF-файл. Затем этот файл можно перекодировать в другой формат. Если вы перекодируете в AVI, у вас будет чересстрочный файл, но стандартные фильтры воспроизведения DirectShow AVI не распознают его как таковой, потому что они не поддерживают VIDEOINFOHEADER2. Другой подход заключается в написании собственного фильтра оболочки DMO, который поддерживает интерфейс INSSBuffer.

Работа с DMO кодеками