Dela via


Att använda Two-Pass-kodningen (Windows Media Format 11 SDK)

[Funktionen som är associerad med den här sidan, Windows Media Format 11 SDK, är en äldre funktion. Det har ersatts av Source Reader och Sink Writer. Source Reader och Sink Writer har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder Source Reader och Sink Writer i stället för Windows Media Format 11 SDK, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

Vissa codecs stöder kodning med två pass för vissa format. I vissa fall kräver en codec att ett angivet format kodas med två pass. När kodning med två pass används skickar du exemplen för dataströmmen till codec före kodningspasset. Codec analyserar exemplen och konfigurerar kodningspasset baserat på analysen. Detta resulterar i en mer effektivt kodad fil.

Om du vill ta reda på om en codec stöder kodning med ett enda pass eller två pass, eller båda, för ett visst format anropar du IWMCodecInfo3::SetCodecEnumerationSetting med g_wszNumPasses och lämpligt värde och räknar sedan upp formaten för att se om den du vill ha returneras. Mer information om Windows Media-codecs som stöder kodning med två pass finns i Välja en kodningsmetod.

Du kan använda två-pass-kodning med Windows Media Format SDK genom att anropa metoder för IWMWriterPreprocess-gränssnittet.

I de fall där kodning med två pass krävs för ett visst format, men programmet inte utför ett förbearbetningspass, misslyckas det första anropet till WriteSample med NS_E_INVALID_NUM_PASSES.

Följande exempelfunktion visar hur du utför kodning med två pass. Den här funktionen anropas när författaren har angetts med en profil och startats. Mer information om hur du använder den här koden finns i Använda kodexemplen.

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

Skriva ASF-filer