Dela via


Kodning av obegränsad variabel bithastighet

I kodningsläget för icke-tränad variabel bithastighet (VBR) kodas innehållet till högsta möjliga kvalitet samtidigt som en angiven bithastighet bibehålls.

Obegränsad VBR-kodning använder två kodningspass. När du använder obehindrat VBR-kodning anger du en bithastighet för strömmen, precis som med konstant bithastighetskodning. Kodaren använder dock endast det här värdet som genomsnittlig bithastighet för strömmen och kodar så att kvaliteten är så hög som möjligt samtidigt som genomsnittet bibehålls. Enskilda prover som skapas av kodaren varierar i storlek utan några explicita buffertgränser. Den genomsnittliga bithastigheten under kodningssessionen och dataströmmens varaktighet får dock inte vara mer än det värde som du har angett. Den faktiska bithastigheten när som helst i den kodade strömmen kan variera kraftigt från det genomsnittliga värdet. Du ställer inte in ett buffertfönster för obunden VBR-kodning. Kodaren beräknar i stället storleken på det buffertfönster som krävs baserat på kraven för de kodade exemplen. Det innebär att det inte finns någon gräns för storleken på enskilda exempel i dataströmmen, så länge den genomsnittliga bithastigheten är mindre än eller lika med det värde som du anger.

Fördelen med icke-tränad VBR-kodning är att den komprimerade strömmen har högsta möjliga kvalitet samtidigt som den håller sig inom en förutsägbar genomsnittlig bandbredd. Använd detta när du behöver ange en bandbredd, men fluktuationer runt den angivna bandbredden är godtagbara. till exempel för lokala filer eller endast nedladdning.

Nackdelen med det här kodningsläget är att kodaren kan ange buffertfönstret till det värde som krävs efter kodningen, vilket ger dig ingen kontroll över buffertstorleken. Om du i de flesta fall inte bryr dig om buffertens storlek eller bandbreddsanvändningens konsekvens bör du använda Quality-Based variabel bithastighetskodning

Konfigurera kodaren för obegränsad VBR

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 Transform (MFT) baserat på den genomsnittliga bithastigheten.

I följande lista visas de egenskaper som du måste ange 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 det obehindrade VBR-läget använder två kodningspass.
  • När du räknar upp utdatamedietypen 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 de tillgängliga utdatamedietyperna. Välj 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.

För att hämta värdet för buffertfönstret, som anges av kodaren, anropas IWMCodecLeakyBucket::GetBufferSizeBits, definierad i wmcodecifaces.h och 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_LEAKYBUCKET1 (genomsnittliga läckande bucketvärden) på dataströmkonfigurationsobjektet när du konfigurerar ASF-profilen.

Följande ändrar metoden SetEncodingType i exempelklassen CEncoder för att konfigurera det obegrä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 unconstrained VBR
//
/////////////////////////////////////////////////////////////////////////

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_Unconstrained)
    {
        //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);
    }

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

ASF-kodningstyper

Den läckande hinkbuffertmodellen

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