使用 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;
}
相關主題