Uso della codifica Two-Pass (Windows Media Format 11 SDK)

[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita dal lettore di origine e dal writer sink. Lettore di origine e writer sink sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi lettore di origine e writer sink anziché Windows Media Format 11 SDK, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Alcuni codec supportano la codifica a due passaggi per determinati formati. In alcuni casi, un codec richiede che un formato specificato venga codificato usando due passaggi. Quando viene usata la codifica a due passaggi, si inviano gli esempi per il flusso al codec prima del passaggio di codifica. Il codec analizza gli esempi e configura il passaggio di codifica in base all'analisi. In questo modo si ottiene un file con codifica più efficiente.

Per determinare se un codec supporta la codifica one-pass o due passaggi o entrambi, per un determinato formato, chiamare IWMCodecInfo3::SetCodecEnumerationSetting con g_wszNumPasses e il valore appropriato e quindi enumerare i formati per verificare se viene restituito quello desiderato. Per altre informazioni sui codec Windows Media che supportano la codifica a due passaggi, vedere Scelta di un metodo di codifica.

È possibile usare la codifica a due passaggi con Windows Media Format SDK chiamando i metodi dell'interfaccia IWMWriterPreprocess .

Nei casi in cui è necessaria la codifica a due passaggi per un particolare formato, ma l'applicazione non riesce a eseguire un passaggio di pre-elaborazione, la prima chiamata a WriteSample avrà esito negativo con NS_E_INVALID_NUM_PASSES.

La funzione di esempio seguente illustra come eseguire la codifica a due passaggi. Questa funzione viene chiamata dopo che il writer è stato impostato con un profilo e avviato. Per altre informazioni sull'uso di questo codice, vedere Uso degli esempi di codice.

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

Scrittura di file ASF