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


Использование API Транскода

В этом разделе описано, как использовать API транскодирования для кодирования файла мультимедиа.

Обзор

Перед использованием API транскодирования приложение должно иметь следующие фрагменты информации:

  • Путь или URL-адрес существующего файла мультимедиа, который будет перекодирован.
  • Имя выходного файла.
  • Тип контейнера для выходного файла, например MP4 или Расширенный формат потоковой передачи (ASF).
  • Формат кодирования. Эти сведения включают типы носителей, описывающие закодированные аудиопотоки и видеопотоки.

Чтобы использовать API транскодирования, приложение выполняет следующие действия.

  1. Создайте источник мультимедиа для чтения исходного файла.
  2. Создайте профиль транскодирования. Добавьте атрибуты, описывающие аудиопоток, видеопоток и контейнер файлов.
  3. Используйте профиль транскода для создания топологии кодирования. (Дополнительные сведения о топологиях см. в разделе о топологиях.)
  4. Установите топологию на мультимедийном сеансе .
  5. Запустите сеанс мультимедиа и дождитесь события MESessionEnded.

Остальная часть этого раздела подробно описывает эти действия.

Создание источника мультимедиа

Источник мультимедиа — это объект, который считывает и анализирует исходный файл. Чтобы создать источник мультимедиа, используйте разрешение источников. Пример кода можно найти в разделе с помощьюсопоставителя источника.

Создание профиля Транскода

Профиль транскода задаёт формат и параметры, используемые для кодирования выходного файла. Профиль транскода содержит три набора атрибутов:

  • Атрибуты звука: описание целевого формата звука и параметров кодировщика звука.
  • Атрибуты видео: описание целевого формата видео и параметров кодировщика видео.
  • Атрибуты контейнера: определите тип контейнера файлов, а также некоторые глобальные параметры кодирования.

Чтобы создать профиль транскода, вызовите функцию MFCreateTranscodeProfile. Эта функция возвращает указатель на интерфейс IMFTranscodeProfile. Исходный объект профиля пуст; Он не содержит атрибутов. Далее необходимо добавить атрибуты, определяющие профиль.

Атрибуты звука

Чтобы добавить атрибуты для звукового потока, вызовите IMFTranscodeProfile::SetAudioAttributes. Эти атрибуты указывают, как кодируется звуковой поток. Если выходной файл не будет содержать аудиопоток, опустите эти атрибуты.

Атрибуты звука делятся на две категории:

  • Атрибуты, определяющие формат закодированного потока
  • Атрибуты, указывающие другие параметры кодирования.

Атрибуты формата — это просто атрибуты типа мультимедиа, как описано в разделе Типы аудиофайла. Точный набор атрибутов формата зависит от кодировщика. (См. поддерживаемые форматы мультимедиа в Media Foundation.) Ниже приведен список типичных атрибутов формата звука:

Атрибут форматирования Описание
MF_MT_SUBTYPE Подтип. См. идентификаторы графического интерфейса аудио.
MF_MT_AUDIO_NUM_CHANNELS Количество аудиоканалов.
MF_MT_AUDIO_SAMPLES_PER_SECOND Количество примеров звука в секунду.
MF_MT_AUDIO_BLOCK_ALIGNMENT Выравнивание блока.
MF_MT_AUDIO_AVG_BYTES_PER_SECOND Среднее число байтов в секунду (закодированное число битов).

 

Определены следующие параметры кодирования.

Параметр кодирования Описание
MF_TRANSCODE_DONOT_INSERT_ENCODER Запрещает API транскодирования вставлять кодировщик для звукового потока.
MF_TRANSCODE_ENCODINGPROFILE Указывает шаблон соответствия устройств. (Применяется только к файлам ASF.)
MF_TRANSCODE_QUALITYVSSPEED Указывает компромисс между качеством кодирования и скоростью.

 

Необходимо задать атрибуты формата. Параметры кодирования являются необязательными.

Одним из способов найти формат, совместимый с кодировщиком, является вызов функции MFTranscodeGetAudioOutputAvailableTypes. Требуемый кодировщик задается подтипом. Функция возвращает коллекцию типов носителей для этого кодировщика. Вы можете выбрать тип из списка и скопировать атрибуты в профиль. Пример кода, использующего этот подход, см. в руководстве: Кодирование файла WMA .

Атрибуты видео

Чтобы добавить атрибуты для видеопотока, вызовите IMFTranscodeProfile::SetVideoAttributes. Эти атрибуты указывают, как кодируется видеопоток. Если выходной файл не будет содержать видеопоток, опустите эти атрибуты.

Как и в случае с атрибутами звука, атрибуты видео делятся на две категории:

  • Атрибуты, определяющие формат закодированного потока
  • Атрибуты, указывающие другие параметры кодирования.

Атрибуты формата — это атрибуты типа мультимедиа, как описано в разделе Типы мультимедиа видео. Ниже приведен список типичных атрибутов формата видео:

Атрибут форматирования Описание
MF_MT_SUBTYPE Подтип. См. идентификаторы GUIDs подтипов видео.
MF_MT_FRAME_RATE Частота кадров.
MF_MT_FRAME_SIZE Размер кадра.
MF_MT_AVG_BITRATE Средний битрейт.
MF_MT_PIXEL_ASPECT_RATIO Пропорции пикселей.

 

Определены следующие параметры кодирования.

Параметр кодирования Описание
MF_TRANSCODE_DONOT_INSERT_ENCODER Предотвращает добавление кодировщика в видеопоток через API транскодирования.
MF_TRANSCODE_ENCODINGPROFILE Указывает шаблон соответствия устройств. (Применяется только к файлам ASF.)
MF_TRANSCODE_QUALITYVSSPEED Указывает компромисс между качеством кодирования и скоростью.

 

Необходимо задать атрибуты формата. Параметры кодирования являются необязательными.

Атрибуты контейнера

Атрибуты контейнера определяют характеристики файлового уровня выходного файла. Чтобы задать атрибуты контейнера, вызовите IMFTranscodeProfile::SetContainerAttributes. Определены следующие атрибуты.

Атрибут Описание
MF_TRANSCODE_ADJUST_PROFILE Определяет параметры потока, используемые для топологии транскода. Флаги можно задать для использования входных параметров источника или использования настраиваемых атрибутов потока.
MF_TRANSCODE_CONTAINERTYPE Указывает формат файла выходного файла, например MP4 или ASF. На основе этого значения в топологию добавляется соответствующий приемник мультимедиа.
MF_TRANSCODE_SKIP_METADATA_TRANSFER Указывает, копируются ли метаданные из источника в выходной файл.
MF_TRANSCODE_TOPOLOGYMODE Указывает, могут ли аппаратные кодеки использоваться во время перекодирования.
MFT_FIELDOFUSE_UNLOCK_Attribute Разблокирует кодек с ограничениями на использование в определенных областях. Дополнительные сведения см. в разделе Поля ограничений использования.

 

Атрибут MF_TRANSCODE_CONTAINERTYPE является обязательным. Другие атрибуты контейнера являются необязательными.

Создание топологии Транскода

Топология транскода — это частичная топология, содержащая источник мультимедиа, соответствующие кодеки и приемник мультимедиа. Чтобы создать топологию транскода, вызовите функцию MFCreateTranscodeTopology. Эта функция принимает следующие параметры в качестве входных данных:

  • Указатель на интерфейс IMFMediaSource источника мультимедиа.
  • Имя выходного файла.
  • Указатель на интерфейс профиля транскодирования IMFTranscodeProfile.

Функция возвращает указатель на интерфейс IMFTopology.

Запуск сеанса кодирования

После создания топологии вы будете готовы закодировать файл. Вы можете удалить профиль на этом этапе.

  1. Вызовите MFCreateMediaSession для создания сеанса мультимедиа.
  2. Вызовите IMFMediaSession::SetTopology, чтобы задать топологию в сеансе мультимедиа.
  3. Вызовите IMFMediaSession::Start, чтобы начать сеанс кодирования.
  4. Дождитесь события MESessionEnded.
  5. Вызовите IMFMediaSession::Close, чтобы закрыть сеанс мультимедиа.
  6. Дождитесь события MESessionClosed.
  7. Вызов IMFMediaSource::Shutdown.
  8. Вызов IMFMediaSession::Shutdown.

Большая часть времени, затраченного на кодировку, происходит между шагами 3 и 4.

Transcode API

О медиасеансе