Sdílet prostřednictvím


Quality-Based kódování proměnlivé bitové rychlosti

Na rozdíl od kódování konstantní přenosové rychlosti (CBR), kde kodér usiluje o zachování konkrétní přenosové rychlosti zakódovaného média, v režimu proměnlivé přenosové rychlosti (VBR) se kodér snaží dosáhnout nejlepší možné kvality zakódovaného média. Hlavní rozdíl mezi CBR a VBR je velikost použitého okna vyrovnávací paměti. Streamy kódované VBR obvykle mají větší okna vyrovnávací paměti ve srovnání s datovými proudy kódovanými CBR.

Kvalita zakódovaného obsahu je určena množstvím dat, která se ztratí při komprimaci obsahu. Mnoho faktorů ovlivňuje ztrátu dat v procesu komprese; ale obecně platí, že čím složitější jsou původní data a čím vyšší je poměr komprese, tím více podrobností se v procesu komprese ztratí.

V režimu VBR založeném na kvalitě nedefinujete bitovou rychlost ani okno vyrovnávací paměti, které musí kodér dodržovat. Místo toho zadáte úroveň kvality digitálního datového proudu médií místo přenosové rychlosti. Kodér komprimuje obsah tak, aby všechny vzorky byly srovnatelné kvality; zajišťuje, aby kvalita byla konzistentní v průběhu přehrávání bez ohledu na požadavky na vyrovnávací paměť výsledného datového proudu.

Kódování VBR založené na kvalitě obvykle vytváří velké komprimované datové proudy. Obecně platí, že tento typ kódování je vhodný pro místní přehrávání nebo síťová připojení s velkou šířkou pásma (nebo stahování a přehrávání). Můžete například napsat aplikaci pro kopírování skladeb z disku CD do souborů ASF v počítači. Použití kódování VBR založené na kvalitě by zajistilo, že všechny zkopírované skladby mají stejnou kvalitu. V takových případech bude konzistentní kvalita poskytovat lepší uživatelské prostředí.

Nevýhodou kódování VBR založeného na kvalitě je, že neexistuje způsob, jak znát požadavky na velikost nebo šířku pásma zakódovaného média před relací kódování, protože kodér používá jeden průchod kódování. Díky tomu mohou být soubory VBR kódované na základě kvality nevhodné za okolností, kdy je omezená paměť nebo šířka pásma, například přehrávání obsahu na přenosných přehrávačích médií nebo streamování přes síť s nízkou šířkou pásma.

Konfigurace kodéru pro kódování Quality-Based VBR

Konfigurace kodéru se nastavuje prostřednictvím hodnot vlastností. Tyto vlastnosti jsou definovány v wmcodecdsp.h. Před vyjednáváním typu výstupního média musí být u kodéru nastaveny vlastnosti konfigurace. Informace o tom, jak nastavit vlastnosti kodéru, naleznete v tématu Konfigurace kodéru.

Následující seznam obsahuje vlastnosti, které je nutné nastavit pro tento typ kódování:

  • Zadejte režim kódování VBR nastavením vlastnosti MFPKEY_VBRENABLED na VARIANT_TRUE.
  • Nastavte MFPKEY_PASSESUSED na hodnotu 1, protože tento režim VBR používá jeden průchod kódování.
  • Nastavte požadovanou úroveň kvality (od 0 do 100) nastavením vlastnosti MFPKEY_DESIRED_VBRQUALITY. VBR založený na kvalitě nekóduje obsah na žádné předdefinované parametry vyrovnávací paměti. Tato úroveň kvality, která bude zachována pro celý datový proud bez ohledu na požadavky na přenosovou rychlost, které mají za následek.
  • U datových proudů videa nastavte průměrnou přenosovou rychlost na nenulovou hodnotu v atributu MF_MT_AVG_BITRATE u výstupního média kodéru. Po dokončení relace kódování se aktualizuje přesná přenosová rychlost.

Následující příklad kódu ukazuje implementaci SetEncodingProperties. Tato funkce nastaví vlastnosti kódování na úrovni datového proudu pro CBR a VBR.

//-------------------------------------------------------------------
//  SetEncodingProperties
//  Create a media source from a URL.
//
//  guidMT:  Major type of the stream, audio or video
//  pProps:  A pointer to the property store in which 
//           to set the required encoding properties.
//-------------------------------------------------------------------

HRESULT SetEncodingProperties (const GUID guidMT, IPropertyStore* pProps)
{
    if (!pProps)
    {
        return E_INVALIDARG;
    }

    if (EncodingMode == NONE)
    {
        return MF_E_NOT_INITIALIZED;
    }
   
    HRESULT hr = S_OK;

    PROPVARIANT var;

    switch (EncodingMode)
    {
        case CBR:
            // Set VBR to false.
            hr = InitPropVariantFromBoolean(FALSE, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Set the video buffer window.
            if (guidMT == MFMediaType_Video)
            {
                hr = InitPropVariantFromInt32(VIDEO_WINDOW_MSEC, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_VIDEOWINDOW, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            break;

        case VBR:
            //Set VBR to true.
            hr = InitPropVariantFromBoolean(TRUE, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Number of encoding passes is 1.

            hr = InitPropVariantFromInt32(1, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_PASSESUSED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Set the quality level.

            if (guidMT == MFMediaType_Audio)
            {
                hr = InitPropVariantFromUInt32(98, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_DESIRED_VBRQUALITY, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            else if (guidMT == MFMediaType_Video)
            {
                hr = InitPropVariantFromUInt32(95, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_VBRQUALITY, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            break;

        default:
            hr = E_UNEXPECTED;
            break;
    }    

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

Typy kódování ASF