Использование API Transcode

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

Обзор

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

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

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

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

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

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

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

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

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

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

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

Звуковые атрибуты

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

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

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

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

Атрибут Format Описание:
MF_MT_SUBTYPE Подтип. См. идентификаторы GUID подтипа звука.
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. Эти атрибуты указывают, как кодируется видеопоток. Если выходной файл не будет содержать видеопоток, опустите эти атрибуты.

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

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

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

Атрибут Format Описание:
MF_MT_SUBTYPE Подтип. См. идентификаторы GUID подтипа видео.
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. Определены следующие атрибуты.

attribute Описание:
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

Сведения о сеансе мультимедиа