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;
}
関連トピック