使用转码 API

本主题介绍了如何使用转码 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。 定义了以下属性。

属性 说明
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 函数。 此函数采用以下参数作为输入:

函数返回指向 IMFTopology 接口的指针。

运行编码会话

创建拓扑后,即可对文件进行编码。 此时可以放弃配置文件。

  1. 调用 MFCreateMediaSession 以创建媒体会话。
  2. 调用 IMFMediaSession::SetTopology 以在媒体会话上设置拓扑。
  3. 调用 IMFMediaSession::Start 以启动编码会话。
  4. 等待 MESessionEnded 事件。
  5. 调用 IMFMediaSession::Close 以关闭媒体会话。
  6. 等待 MESessionClosed 事件。
  7. 调用 IMFMediaSource::Shutdown
  8. 调用 IMFMediaSession::Shutdown

编码所用的大部分时间发生在步骤 3 和步骤 4 之间。

转码 API

关于媒体会话