Two-Pass エンコードの使用 (Windows Media Format 11 SDK)

[このページに関連付けられている機能である Windows Media Format 11 SDK は、レガシ機能です。 これは、ソース リーダーシンク ライターによって置き換えられます。 ソース リーダーシンク ライターは、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、Windows Media Format 11 SDK ではなくソース リーダーシンク ライターを使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

一部のコーデックでは、特定の形式に対して 2 パス エンコードがサポートされています。 場合によっては、コーデックでは、2 つのパスを使用して指定した形式をエンコードする必要があります。 2 パス エンコードを使用する場合は、エンコード パスの前にストリームのサンプルをコーデックに送信します。 コーデックはサンプルを分析し、分析に基づいてエンコード パスを構成します。 これにより、より効率的にエンコードされたファイルが作成されます。

コーデックが特定の形式に対してワンパス エンコード、2 パス、またはその両方をサポートしているかどうかを判断するには、g_wszNumPassesと適切な値を指定して IWMCodecInfo3::SetCodecEnumerationSetting を呼び出し、目的の形式が返されるかどうかを確認します。 2 パス エンコードをサポートする Windows Media コーデックの詳細については、「 エンコード方法の選択」を参照してください。

IWMWriterPreprocess インターフェイスのメソッドを呼び出すことで、Windows Media Format SDK で 2 パス エンコードを使用できます。

特定の形式に対して 2 パス エンコードが必要で、アプリケーションが前処理パスを実行できない場合、 WriteSample の最初の呼び出しは NS_E_INVALID_NUM_PASSES で失敗します。

次の関数例は、2 パス エンコードを実行する方法を示しています。 この関数は、ライターがプロファイルで設定され、開始された後に呼び出されます。 このコードの使用方法の詳細については、「コード 例の使用」を参照してください。

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 ファイルの書き込み