設定標準、Professional或無遺失音訊編碼
當Windows媒體音訊編碼器列舉輸出類型時,它會將每個列舉類型識別為標準、Professional或遺失。 您可以執行下列步驟來判斷輸出類型為 Standard、Professional或 Lossless。
- 呼叫 IMFTransform::GetOutputAvailableType 以取得代表輸出類型的 IMFMediaType 介面。
- 呼叫 IMFMediaType::GetRepresentation 以取得包含輸出類型相關資訊 的AM_MEDIA_TYPE 結構。
- AM_MEDIA_TYPE結構的pbFormat成員會指向包含輸出類型其他資訊之「其」的「TBATEX」結構。 檢查其為「其」結構之 wFormatTag成員。 值0x161表示 Standard、0x162值表示Professional,而值 0x163表示「無遺失」。
如果您在列舉輸出類型之前,先在Windows媒體音訊編碼器上設定屬性,您可以限制列舉的輸出類型數目。 例如,如果您適當地設定 VBR 屬性,您可以將列舉的輸出類型限制為位於 [無遺失] 類別中的輸出類型。
標準音頻編碼
您可以使用下列步驟來設定標準音頻編碼。
- 在編碼器上設定您選擇的屬性。
- 列舉可能的輸出類型。
- 檢查列舉型別,然後選擇具有音訊格式標籤的0x161類型。
- 呼叫 IMFTransform::SetOutputType,將輸出類型設定為您選擇的類型。
Professional音訊編碼
您可以使用下列步驟來設定Professional音訊編碼。
- 在編碼器上設定您選擇的屬性。
- 列舉可能的輸出類型。
- 檢查列舉型別,並選擇具有音訊格式標籤的0x162類型。
- 呼叫 IMFTransform::SetOutputType,將輸出類型設定為您選擇的類型。
無遺失音訊編碼
您可以使用下列步驟來設定無遺失音訊編碼。
- 將 MFPKEY_VBRENABLED 屬性設定為 VARIANT_TRUE。
- 將 MFPKEY_CONSTRAIN_ENUMERATED_VBRQUALITY 屬性設定為 VARIANT_TRUE。
- 將 MFPKEY_DESIRED_VBRQUALITY 屬性設定為 100。
- 列舉輸出類型。
- 呼叫 IMFTransform::SetOutputType,將輸出類型設定為步驟 4 中列舉的其中一個類型。
下列程式碼會列舉Windows媒體音訊編碼器的所有無遺失輸出類型。 程式碼會列印每個列舉類型的音訊格式標籤值。 由於所有列舉型別都是不遺失的,所以所有這些格式標籤的值都是 0x163。 假設 pIMT 是Windows媒體音訊編碼器物件上IMFTransform介面的指標,而且 pStore 是相同物件上IPropertyStore介面的指標。 此外,假設 hr 是先前在程式碼中宣告的 HRESULT 類型變數。
PROPVARIANT prop;
prop.vt = VT_BOOL;
prop.boolVal = VARIANT_TRUE;
hr = pStore->SetValue(MFPKEY_VBRENABLED, prop);
if(SUCCEEDED(hr))
{
hr = pStore->SetValue(MFPKEY_CONSTRAIN_ENUMERATED_VBRQUALITY, prop);
if(SUCCEEDED(hr))
{
prop.vt = VT_UI4;
prop.ulVal = 100;
hr = pStore->SetValue(MFPKEY_DESIRED_VBRQUALITY, prop);
if(SUCCEEDED(hr))
{
HRESULT hrAvailableType = S_OK;
LONG j = 0;
while(MF_E_NO_MORE_TYPES != hrAvailableType)
{
IMFMediaType* pOutputType = NULL;
hrAvailableType = pIMFT->GetOutputAvailableType(
0, j, &pOutputType);
if(SUCCEEDED(hrAvailableType))
{
AM_MEDIA_TYPE* pTypeRep = NULL;
hr = pOutputType->GetRepresentation(
AM_MEDIA_TYPE_REPRESENTATION, (VOID**)&pTypeRep);
if(SUCCEEDED(hr))
{
WAVEFORMATEX* pwfex = (WAVEFORMATEX*)pTypeRep->pbFormat;
printf_s("%x\n", pwfex->wFormatTag);
pOutputType->FreeRepresentation(
AM_MEDIA_TYPE_REPRESENTATION, (VOID*)pTypeRep);
}
pOutputType->Release();
++j;
}
} // while
}
}
}
相關主題