MFTranscodeGetAudioOutputAvailableTypes 函数 (mfidl.h)

从音频编码器获取输出格式的列表。

语法

HRESULT MFTranscodeGetAudioOutputAvailableTypes(
  [in]  REFGUID       guidSubType,
  [in]  DWORD         dwMFTFlags,
  [in]  IMFAttributes *pCodecConfig,
  [out] IMFCollection **ppAvailableTypes
);

参数

[in] guidSubType

指定输出媒体的子类型。 编码器在枚举可用的输出类型时使用此值作为筛选器。 有关音频子类型的信息,请参阅 音频子类型 GUID

[in] dwMFTFlags

_MFT_ENUM_FLAG 枚举中零个或多个标志的按位 OR

[in] pCodecConfig

指向属性存储的 IMFAttributes 接口的指针。 属性存储指定编码器配置设置。 此参数可以为 NULL。 属性存储可以保存以下任何属性。

含义
MFT_FIELDOFUSE_UNLOCK_Attribute
设置此属性可解锁具有使用字段说明的编码器。
MF_TRANSCODE_ENCODINGPROFILE
指定 Windows Media 编码器的设备一致性配置文件。
MF_TRANSCODE_QUALITYVSSPEED
设置编码质量和编码速度之间的权衡。

[out] ppAvailableTypes

接收指向集合对象的 IMFCollection 接口的指针,该集合对象包含首选音频媒体类型的列表。 集合包含 IMFMediaType 指针。 调用方必须释放接口指针。

返回值

函数返回 HRESULT。 可能的值包括(但并不限于)下表中的项。

返回代码 说明
S_OK
函数调用成功。
MF_E_TRANSCODE_NO_MATCHING_ENCODER
找不到与指定配置设置匹配的编码器。

注解

此函数假定编码器将在其默认编码模式下使用,该模式通常是常量比特率 (CBR) 编码。 因此,函数返回的类型可能不适用于其他模式,例如可变比特率 (VBR) 编码。

在内部,此函数的工作原理是调用 MFTEnumEx 查找匹配的编码器,然后调用 IMFTransform::GetOutputAvailableType 以获取编码器的输出类型。

示例

以下示例为 Windows Media Audio (WMA) 创建转码配置文件。

template <class Q>
HRESULT GetCollectionObject(IMFCollection *pCollection, DWORD index, Q **ppObj)
{
    IUnknown *pUnk;
    HRESULT hr = pCollection->GetElement(index, &pUnk);
    if (SUCCEEDED(hr))
    {
        hr = pUnk->QueryInterface(IID_PPV_ARGS(ppObj));
        pUnk->Release();
    }
    return hr;
}

HRESULT CreateTranscodeProfile(IMFTranscodeProfile **ppProfile)
{
    IMFTranscodeProfile *pProfile = NULL;     // Transcode profile.
    IMFCollection   *pAvailableTypes = NULL;  // List of audio media types.
    IMFMediaType    *pAudioType = NULL;       // Audio media type.
    IMFAttributes   *pAudioAttrs = NULL;      // Copy of the audio media type.
    IMFAttributes   *pContainer = NULL;       // Container attributes.

    DWORD dwMTCount = 0;
    
    // Create an empty transcode profile.
    HRESULT hr = MFCreateTranscodeProfile(&pProfile);
    if (FAILED(hr))
    {
        goto done;
    }

    // Get output media types for the Windows Media audio encoder.

    // Enumerate all codecs except for codecs with field-of-use restrictions.
    // Sort the results.

    DWORD dwFlags = 
        (MFT_ENUM_FLAG_ALL & (~MFT_ENUM_FLAG_FIELDOFUSE)) | 
        MFT_ENUM_FLAG_SORTANDFILTER;

    hr = MFTranscodeGetAudioOutputAvailableTypes(MFAudioFormat_WMAudioV9, 
        dwFlags, NULL, &pAvailableTypes);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pAvailableTypes->GetElementCount(&dwMTCount);
    if (FAILED(hr))
    {
        goto done;
    }
    if (dwMTCount == 0)
    {
        hr = E_FAIL;
        goto done;
    }

    // Get the first audio type in the collection and make a copy.
    hr = GetCollectionObject(pAvailableTypes, 0, &pAudioType);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = MFCreateAttributes(&pAudioAttrs, 0);       
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pAudioType->CopyAllItems(pAudioAttrs);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the audio attributes on the profile.
    hr = pProfile->SetAudioAttributes(pAudioAttrs);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the container attributes.
    hr = MFCreateAttributes(&pContainer, 1);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pContainer->SetGUID(MF_TRANSCODE_CONTAINERTYPE, MFTranscodeContainerType_ASF);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pProfile->SetContainerAttributes(pContainer);
    if (FAILED(hr))
    {
        goto done;
    }

    *ppProfile = pProfile;
    (*ppProfile)->AddRef();

done:
    SafeRelease(&pProfile);
    SafeRelease(&pAvailableTypes);
    SafeRelease(&pAudioType);
    SafeRelease(&pAudioAttrs);
    SafeRelease(&pContainer);
    return hr;
}

要求

要求
最低受支持的客户端 Windows 7 [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 R2 [仅限桌面应用]
目标平台 Windows
标头 mfidl.h
Library Mf.lib
DLL Mf.dll

另请参阅

IMFCollection::GetElement

MFCreateTranscodeProfile

媒体基础函数

教程:对 WMA 文件进行编码