枚举特定编码模式的音频类型 (Microsoft Media Foundation)

音频编码器接受的输入和输出媒体类型非常结构化。 必须通过调用 IMediaObject::GetOutputType 方法或 IMFTransform::GetOutputType 来获取支持的输出类型。 获取输出类型后,不得对其进行更改。

如果要使用一次传递 CBR 以外的编码模式,则必须设置模式,然后枚举该模式的输出类型;编码器根据模式集更改支持的输出类型。 控制编码模式的属性 MFPKEY_VBRENABLEDMFPKEY_PASSESUSED。 在编码器中设置模式时,必须枚举并选择一个输出类型,且无需更改即可使用它,就像使用 CBR 一样。

标识基于质量的 VBR 类型

识别基于质量的 VBR 类型的过程取决于编码器是充当 DirectX 媒体对象 (DMO) ,还是充当媒体基础转换 (MFT) 。 有关编码器何时充当 DMO 或 MFT 的信息,请参阅编解码器对象下的各个 编解码器参考页。

当音频编码器充当 DMO 并且你配置编码器以使用单传递 VBR 时,它会枚举所有支持的输出类型。 但是,通常需要根据 quality 参数选择一次性 VBR 类型。 编码器将单次传递 VBR 输出类型的质量值放在 DMO_MEDIA_TYPE.pbFormat 指向的 WAVEFORMATEX 结构的 nAvgBytesPerSec 成员中。

此值以以下格式存储:0x7FFFFFXX,其中 XX 是 (从 0 到 100) 的质量值。 例如,0x7FFFFF62 的 nAvgBytesPerSec 值指定质量级别 98 (0x62 = 98) 。

以下示例演示如何在编码器充当 DMO 时检查格式的质量级别。

void ShowQuality(WAVEFORMATEX* pWave)
{
    // Store the average bytes per second in a local variable
    // with a more manageable name.
    DWORD dwBps = pWave->nAvgBytesPerSec;

    // Verify that the value is a VBR quality level by using 
    // a bitmask to check for the bit pattern 0x7FFFFFXX. 
    if(dwBps & 0x7FFFFF00 == 0x7FFFFF00)
        printf("VBR Quality: %d%%\n",(dwBps & 0x000000FF));
    else // Not a valid VBR quality value.
        printf("Not a valid one-pass VBR audio format.\n");
}

当编码器充当 MFT 并在调用 GetAvailableOutputType 时枚举输出类型时,可以查询 MFT 以获取 MFPKEY_MOST_RECENTLY_ENUMERATED_VBRQUALITY 属性。 返回的值指示最近返回的输出媒体类型的 VBR 质量。 然后,可以使用该值设置编码器 的 MFPKEY_DESIRED_VBRQUALITY 属性。

设置峰值约束

对于基于质量的 VBR (单次传递) 和不受约束的双传递 VBR,检索输出类型后不需要其他设置。 若要使用受峰值约束的 VBR,请检索启用了 VBR 并设置了两个传递的输出类型。 此类型(无需更改)描述不受约束的 VBR 设置。 若要设置峰值约束,请设置 MFPKEY_RMAXMFPKEY_BMAX 属性。

配置音频编码

查找音频编码器输出类型

使用Two-Pass编码

使用 VBR 编码