Partilhar via


Usando a codificação Two-Pass (Windows Media Format 11 SDK)

[A funcionalidade associada a esta página, Windows Media Format 11 SDK, é uma funcionalidade herdada. Foi substituído por Source Reader e Sink Writer. O Source Reader e o Sink Writer foram otimizados para o Windows 10 e o Windows 11. A Microsoft recomenda vivamente que o novo código utilize Source Reader e Sink Writer em vez de Windows Media Format 11 SDK, sempre que possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Alguns codecs suportam codificação em duas etapas para determinados formatos. Em alguns casos, um codec requer que um formato especificado seja codificado usando duas passagens. Quando a codificação de duas etapas é usada, você envia os exemplos para o fluxo para o codec antes do passo de codificação. O codec analisa as amostras e configura o passo de codificação com base na análise. Isso resulta em um arquivo codificado de forma mais eficiente.

Para determinar se um codec suporta codificação de uma passagem, ou de duas passagens, ou ambas, para um determinado formato, chame IWMCodecInfo3::SetCodecEnumerationSetting com g_wszNumPasses e o valor apropriado e, em seguida, enumere os formatos para ver se o que você deseja é retornado. Para obter mais informações sobre os codecs do Windows Media que suportam codificação em duas etapas, consulte Escolhendo um método de codificação.

Você pode usar a codificação em duas passagens com o SDK do Windows Media Format, chamando os métodos da interface IWMWriterPreprocess.

Nos casos em que a codificação em duas etapas é necessária para um formato específico, mas o aplicativo não consegue executar um passo de pré-processamento, a primeira chamada para WriteSample falhará com NS_E_INVALID_NUM_PASSES.

A função de exemplo a seguir demonstra como executar a codificação de duas etapas. Esta função é chamada depois que o gravador foi definido com um perfil e iniciado. Para obter mais informações sobre como usar esse código, consulte Usando os exemplos de código.

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

Escrevendo arquivos ASF