Compartir a través de


Uso de la codificación Two-Pass (SDK de Windows Media Format 11)

[La característica asociada a esta página, SDK de Windows Media Format 11, es una característica heredada. Se ha reemplazado por lector de origen y escritor receptor. El lector de origen y el sistema de escritura receptor se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use lector de origen y escritor receptor en lugar del SDK de Windows Media Format 11, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Algunos códecs admiten la codificación de dos pasos para determinados formatos. En algunos casos, un códec requiere que se codifique un formato especificado mediante dos pases. Cuando se usa la codificación de dos pasos, se envían los ejemplos de la secuencia al códec antes de pasar la codificación. El códec analiza los ejemplos y configura el paso de codificación en función del análisis. Esto da como resultado un archivo codificado de forma más eficaz.

Para determinar si un códec admite la codificación de un solo paso, o dos pasos, o ambos, para un formato determinado, llame a IWMCodecInfo3::SetCodecEnumerationSetting con g_wszNumPasses y el valor adecuado y, a continuación, enumere los formatos para ver si se devuelve el que desea. Para obtener más información sobre los códecs de Windows Media que admiten la codificación de dos pasos, vea Elegir un método de codificación.

Puedes usar la codificación de dos pasos con el SDK de Windows Media Format llamando a métodos de la interfaz IWMWriterPreprocess .

En los casos en los que se requiere la codificación de dos pasos para un formato determinado, pero la aplicación no puede realizar un paso de preprocesamiento, se producirá un error en la primera llamada a WriteSample con NS_E_INVALID_NUM_PASSES.

La siguiente función de ejemplo muestra cómo realizar la codificación de dos pasos. Se llama a esta función después de establecer el escritor con un perfil e iniciarse. Para obtener más información sobre el uso de este código, vea Uso de los ejemplos 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;
}

Escribir archivos ASF