Compartilhar via


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

[O recurso associado a esta página, Windows Media Format 11 SDK, é um recurso herdado. Ele foi substituído por Leitor de Origem e Gravador de Coletor. O Leitor de Origem e o Gravador do Coletor foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o Leitor de Origem e o Gravador do Coletor em vez do SDK do Windows Media Format 11, quando 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 dão suporte à codificação de duas passões para determinados formatos. Em alguns casos, um codec requer 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 passagem de codificação. O codec analisa os exemplos e configura a passagem 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 a duas passões, ou ambos, para um determinado formato, chame IWMCodecInfo3::SetCodecEnumerationSetting com g_wszNumPasses e o valor apropriado e, em seguida, enumere os formatos para ver se aquele que você deseja que seja retornado. Para obter mais informações sobre os codecs do Windows Media que dão suporte à codificação de duas passões, consulte Escolhendo um método de codificação.

Você pode usar a codificação de duas passões com o SDK de Formato de Mídia do 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