Dela via


Peak-Constrained variabel bithastighetskodning

I den toppbegränsade variabelbithastigheten (VBR) kodas innehållet till en angiven bithastighet och toppvärden: en toppbithastighet och ett toppbufferfönster. De här toppvärdena kallas också toppvärden för läckande hink. Filen kodas för att överensstämma med en buffert som beskrivs av de högsta värdena, så att den totala genomsnittliga bithastigheten för dataströmmen är lika med eller mindre än det genomsnittliga bithastighetsvärdet som du angav.

Vanligtvis är den högsta bithastigheten ganska hög. Kodaren ser till att det angivna genomsnittliga bithastighetsvärdet bibehålls under dataströmmens varaktighet (genomsnittlig bithastighet >= (total strömstorlek i bitar/strömvaraktighet i sekunder)). Tänk på följande exempel: Du konfigurerar en ström med en genomsnittlig bithastighet på 16 000 bitar per sekund, en högsta bithastighet på 48 000 bitar per sekund och ett buffertfönster med hög belastning på 3 000 (3 sekunder). Storleken på bufferten som används för strömmen är 144 000 bitar (48 000 bitar per sekund * 3 sekunder) enligt toppvärdena. Kodaren komprimerar data för att överensstämma med bufferten. Dessutom måste den genomsnittliga bithastigheten för strömmen vara 16 000 eller mindre. Om kodaren måste skapa stora exempel för att hantera ett komplext segment av innehåll kan den dra nytta av den stora buffertstorleken. Men andra delar av dataströmmen måste kodas med en lägre bithastighet för att få ner genomsnittet till den angivna nivån. Toppbegränsad VBR-kodning är användbar för uppspelningsenheter med begränsad buffertkapacitet och datahastighetsbegränsningar. Ett vanligt exempel på detta är den kodning som används för DVD-skivor när avkodning utförs av ett chip på en enhet, där det finns maskinvarubegränsningar som måste beaktas.

Konfigurera kodaren för Peak-Constrained VBR

Toppbegränsad VBR är som obehindrat VBR- eftersom det är begränsat till en genomsnittlig bithastighet under strömmens varaktighet. Dessutom överensstämmer toppbegränsad VBR med en toppbuffert. Den här bufferten beskrivs med en toppbithastighet och ett toppbuffertfönster. Det här läget använder två kodningspass och ger kodaren flexibilitet i hur den kodar enskilda exempel samtidigt som den följer de högsta begränsningarna.

Kodarkonfigurationen anges via egenskapsvärden. Dessa egenskaper definieras i wmcodecdsp.h. Konfigurationsegenskaperna måste anges på kodaren innan du förhandlar om utdatamedietypen. Information om hur du anger egenskaper för kodaren finns i Konfigurera kodaren. Baserat på de angivna egenskapsvärdena kan du räkna upp de VBR-utdatatyper som stöds och välja den som krävs för kodaren Media Foundation-transformering (MFT) baserat på den genomsnittliga bithastigheten.

Du måste ange följande egenskaper för den här typen av kodning:

  • Ange VBR-kodningsläget genom att ange egenskapen MFPKEY_VBRENABLED till VARIANT_TRUE.
  • Ange MFPKEY_PASSESUSED till 2 eftersom toppbegränsat VBR-läge använder två kodningspass.
  • Ange MFPKEY_RMAX för att ange den högsta bithastigheten och ange MFPKEY_BMAX för att ange det högsta buffertfönstret.
  • När du räknar upp utdatamediets typ kontrollerar du attributet MF_MT_AUDIO_AVG_BYTES_PER_SECOND (för ljudströmmar) eller attributet MF_MT_AVG_BITRATE (för videoströmmar) för tillgängliga typer av utdatamedier och väljer en utdatamedietyp som har den genomsnittliga bithastigheten närmast önskad genomsnittlig bithastighet som du vill att kodaren ska behålla i det kodade innehållet. Mer information om hur du väljer utdatamedietyp finns i Media Type Negotiation on the Encoder.

Not

Vi rekommenderar att du anger den högsta bithastigheten till minst dubbelt så mycket som den genomsnittliga bithastigheten. Om du sätter toppnivån till ett lägre värde kan det orsaka att kodaren kodar innehållet som tvåpass-CBR i stället för toppbegränsad VBR.

 

Om du vill hämta buffertfönstrets värde som angetts av kodaren anropar du IWMCodecLeakyBucket::GetBufferSizeBits, definierad i wmcodecifaces.h, wmcodecdspuuid.lib, efter kodningssessionen. Om du vill lägga till obehindrat VBR-stöd för strömmarna måste du ange det här värdet i attributet MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (högsta läckande bucketvärden) på dataströmkonfigurationsobjektet när du konfigurerar ASF-profilen.

Följande kodexempel ändrar metoden SetEncodingType i exempelklassen CEncoder för att konfigurera det högsta begränsade VBR-läget. Mer information om den här klassen finns i Kodexempelkod för. Information om de hjälpmakron som används i det här exemplet finns i Använda Media Foundation Code-exempel.

//////////////////////////////////////////////////////////////////////////
//  Name: SetEncodingType
//  Description: Sets the encoding type to peak-constrained VBR mode.
//
/////////////////////////////////////////////////////////////////////////

HRESULT CEncoder::SetEncodingType(EncodeMode mode)
{
    if (!m_pMFT)
    {
        return MF_E_NOT_INITIALIZED;
    }

    HRESULT hr = S_OK;

    IPropertyStore* pProp = NULL;

    PROPVARIANT var;
    PropVariantInit(&var);

    // Query the encoder for its property store.
    CHECK_HR(hr = m_pMFT->QueryInterface(__uuidof(IPropertyStore), (void**)&pProp));
    
    if (mode == EncodeMode_VBR_Peak)
    {
        // Set the VBR property to TRUE, which indicates VBR encoding.
        var.vt = VT_BOOL;
        var.boolVal = TRUE;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_VBRENABLED, var));
        PropVariantClear(&var);

        // Set number of passes.
        var.vt = VT_I4;
        var.lVal  =2;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_PASSESUSED, var));
        PropVariantClear(&var);

        // Set the peak bit rate.
        var.vt = VT_I4;
        var.lVal  =48000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_RMAX, var));
        PropVariantClear(&var);

        // Set the peak buffer window.
        var.vt = VT_I4;
        var.lVal  =3000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_BMAX, var));
        PropVariantClear(&var);
    }

done:
    PropVariantClear(&var);
    SAFE_RELEASE (pProp);
    return hr;
    
}

ASF-kodningstyper

Den läckande hinkbuffertmodellen

Skapa en topologi för Two-Pass Windows Media-kodning