Usando Two-Pass codificação (Windows SDK do Formato de Mídia 11)

Alguns codecs dão suporte à codificação de duas passões para determinados formatos. Em alguns casos, um codec exige que um formato especificado seja codificado usando duas passagens. Quando a codificação de duas passões é usada, você envia os exemplos do fluxo para o codec antes da codificação passar. O codec analisa os exemplos e configura o passe de codificação com base na análise. Isso resulta em um arquivo codificado com mais eficiência.

Para determinar se um codec dá suporte à codificação de uma passagem ou duas passões, ou ambos, para um determinado formato, chame IWMCodecInfo3::SetCodecEnumerationSetting com g_wszNumPasses e o valor apropriado e enumere os formatos para ver se o que você deseja é retornado. Para obter mais informações sobre os codecs de mídia Windows que dão suporte à codificação de duas passões, consulte Como escolher um método de codificação.

Você pode usar a codificação de duas passões com o SDK de formato de mídia Windows chamando métodos da interface IWMWriterPreprocess.

Nos casos em que a codificação de duas passões é necessária para um formato específico, mas o aplicativo não executa uma passagem 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 passões. Essa função é chamada depois que o gravador é 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;
}

Gravando arquivos ASF