(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;
}

编写 ASF 文件