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 媒體編碼器的裝置一致性配置檔。
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
程式庫 Mf.lib
Dll Mf.dll

另請參閱

IMFCollection::GetElement

MFCreateTranscodeProfile

媒體基礎函式

教學課程:編碼 WMA 檔案