使用转码 API
本主题介绍了如何使用转码 API 对媒体文件进行编码。
概述
在使用转码 API 之前,应用程序必须包含以下信息:
- 将重新编码的现有媒体文件的路径或 URL。
- 输出文件的名称。
- 输出文件的容器类型,例如 MP4 或高级流式处理格式 (ASF) 。
- 编码格式。 此信息包括描述编码音频和视频流的媒体类型。
若要使用转码 API,应用程序会执行以下步骤。
- 创建媒体源以读取源文件。
- 创建转码配置文件。 添加描述音频流、视频流和文件容器的属性。
- 使用转码配置文件创建编码拓扑。 (有关拓扑的详细信息,请参阅 关于拓扑。)
- 在 媒体会话上设置拓扑。
- 启动媒体会话并等待 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 函数。 此函数采用以下参数作为输入:
- 指向媒体源的 IMFMediaSource 接口的指针。
- 输出文件的名称。
- 指向转码配置文件的 IMFTranscodeProfile 接口的指针。
函数返回指向 IMFTopology 接口的指针。
运行编码会话
创建拓扑后,即可对文件进行编码。 此时可以放弃配置文件。
- 调用 MFCreateMediaSession 以创建媒体会话。
- 调用 IMFMediaSession::SetTopology 以在媒体会话上设置拓扑。
- 调用 IMFMediaSession::Start 以启动编码会话。
- 等待 MESessionEnded 事件。
- 调用 IMFMediaSession::Close 以关闭媒体会话。
- 等待 MESessionClosed 事件。
- 调用 IMFMediaSource::Shutdown。
- 调用 IMFMediaSession::Shutdown。
编码所用的大部分时间发生在步骤 3 和步骤 4 之间。
相关主题