共用方式為


使用 windows Media Format 11 SDK (Two-Pass編碼)

[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器和接收寫入器已取代它。 來源讀取器和接收寫入器已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用來源讀取器和接收寫入器,而不是Windows Media Format 11 SDK。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

某些編解碼器支援特定格式的雙階段編碼。 在某些情況下,編解碼器會要求使用兩個傳遞來編碼指定的格式。 使用雙階段編碼時,您會在編碼階段之前,將資料流程的樣本傳送至編解碼器。 編解碼器會分析範例,並根據分析設定編碼傳遞。 這會產生更有效率的編碼檔案。

若要判斷編解碼器是否支援單次編碼或雙傳遞,或兩者都支援指定的格式,請呼叫 IWMCodecInfo3::SetCodecEnumerationSetting 並搭配 g_wszNumPasses 和適當的值,然後列舉格式以查看是否傳回您想要的格式。 如需支援雙傳遞編碼之 Windows 媒體編解碼器的詳細資訊,請參閱 選擇編碼方法

您可以藉由呼叫 IWMWriterPreprocess 介面的方法,搭配 Windows Media Format SDK 使用雙傳遞編碼。

如果特定格式需要雙傳遞編碼,但應用程式無法執行前置處理階段,則第一次呼叫 WriteSample 將會失敗,並NS_E_INVALID_NUM_PASSES。

下列範例函式示範如何執行雙階段編碼。 當寫入器已設定設定檔並啟動之後,會呼叫此函式。 如需使用此程式碼的詳細資訊,請參閱 使用程式碼範例

HRESULT PreProcess(IWMWriter* pWriter, DWORD dwInputNum)
{
    HRESULT hr        = S_OK;
    DWORD   dwMaxPass = 0;

    IWMWriterPreprocess* pPreProc = NULL;

    // Get the writer preprocessor interface.
    hr = pWriter->QueryInterface(IID_IWMWriterPreprocess, 
                                 (void**) &pPreProc);
    GOTO_EXIT_IF_FAILED(hr);

    // Check that the input can be preprocessed.
    hr = pPreProc->GetMaxPreprocessingPasses(dwInputNum,0, &dwMaxPass);
    GOTO_EXIT_IF_FAILED(hr);

    if(dwMaxPass == 0)
    {
        hr = NS_E_INVALID_REQUEST;
        goto Exit;
    }

    // Set the number of preprocessing passes to the maximum.
    hr = pPreProc->SetNumPreprocessingPasses(dwInputNum, 0, dwMaxPass);
    GOTO_EXIT_IF_FAILED(hr);

    // Call BeginWriting before calling BeginPreprocessingPass
    hr = pWriter->BeginWriting();

    // Start preprocessing the first pass.
    hr = pPreProc->BeginPreprocessingPass(dwInputNum, 0);
    GOTO_EXIT_IF_FAILED(hr);

    // TODO: Make repeated calls to pPreProc->PreprocessSample to
    // preprocess all the samples in the stream.

    // End preprocessing.
    hr = pPreProc->EndPreprocessingPass(dwInputNum, 0);
    GOTO_EXIT_IF_FAILED(hr);

    // TODO: If the maximum number of preprocessing passes is greater
    // than one, repeat the preprocessing steps for each pass.

Exit:
    SAFE_RELEASE(pPreProc);
    Return hr;
}

寫入 ASF 檔案