Share via


(Microsoft Media Foundation) 列舉特定編碼模式的音訊類型

音訊編碼器所接受的輸入和輸出媒體類型非常結構化。 您必須呼叫 IMediaObject::GetOutputType 方法或 IMFTransform::GetOutputType來取得支援的輸出類型。 取得輸出類型之後,您不得加以改變。

如果您想要使用一次性 CBR 以外的編碼模式,您必須設定模式,然後列舉該模式的輸出類型;編碼器會根據模式集變更支援的輸出類型。 控制編碼模式的屬性會 MFPKEY_VBRENABLEDMFPKEY_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_RMAXMFPKEY_BMAX 屬性。

設定音訊編碼

尋找音訊編碼器輸出類型

使用 Two-Pass 編碼

使用 VBR 編碼