(Windows Media Format 11 SDK) 使用 Two-Pass 编码
[与此页面关联的功能 Windows Media Format 11 SDK 是一项旧功能。 它已被源读取器和接收器编写器取代。 源读取器和接收器编写器已针对Windows 10和Windows 11进行了优化。 如果可能,Microsoft 强烈建议新代码使用源读取器和接收器编写器,而不是 Windows Media 格式 11 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
某些编解码器支持对某些格式进行双重编码。 在某些情况下,编解码器要求使用两个传递对指定的格式进行编码。 使用双重编码时,可以在编码通过之前将流的样本发送到编解码器。 编解码器分析示例,并根据分析配置编码传递。 这会产生更高效的编码文件。
若要确定编解码器对于给定格式是支持单次编码还是两者兼有,请使用g_wszNumPasses和相应值调用 IWMCodecInfo3::SetCodecEnumerationSetting ,然后枚举格式以查看是否返回所需的格式。 有关支持双重编码的 Windows Media 编解码器的详细信息,请参阅 选择编码方法。
可以通过调用 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;
}
相关主题