(Microsoft Media Foundation) 列舉特定編碼模式的音訊類型
音訊編碼器所接受的輸入和輸出媒體類型非常結構化。 您必須呼叫 IMediaObject::GetOutputType 方法或 IMFTransform::GetOutputType來取得支援的輸出類型。 取得輸出類型之後,您不得加以改變。
如果您想要使用一次性 CBR 以外的編碼模式,您必須設定模式,然後列舉該模式的輸出類型;編碼器會根據模式集變更支援的輸出類型。 控制編碼模式的屬性會 MFPKEY_VBRENABLED 和 MFPKEY_PASSESUSED。 在編碼器中設定模式時,您必須列舉並選取輸出類型,而不需變更,就像使用 CBR 一樣。
識別以品質為基礎的 VBR 類型
識別品質型 VBR 類型的程式取決於編碼器是做為 DirectX 媒體物件 (DMO) ,還是做為媒體基礎轉換 (MFT) 。 如需編碼器當做 DMO 或 MFT 時的相關資訊,請參閱 Codec Objects底下的個別編解碼器參考頁面。
當音訊編碼器做為 DMO,而您將編碼器設定為使用單次 VBR 時,它會列舉所有支援的輸出類型。 不過,您通常會想要根據品質參數選取一次性 VBR 類型。 編碼器會將單次 VBR 輸出類型的品質值放在DMO_MEDIA_TYPE.pbFormat 所指向之DMO_MEDIA_TYPE.pbFormat所指向的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_RMAX 和 MFPKEY_BMAX 屬性。
相關主題