Delen via


Quality-Based variabele bitsnelheidcodering

In tegenstelling tot constante bitsnelheidcodering (CBR), waarbij de encoder naar een bepaalde bitsnelheid van de gecodeerde media streeft, streeft de encoder in de modus variabele bitsnelheid (VBR) naar de best mogelijke kwaliteit van de gecodeerde media. Het belangrijkste verschil tussen CBR en VBR is de grootte van het gebruikte buffervenster. VBR-gecodeerde streams hebben meestal grote buffervensters vergeleken met CBR-gecodeerde streams.

De kwaliteit van gecodeerde inhoud wordt bepaald door de hoeveelheid gegevens die verloren gaat wanneer de inhoud wordt gecomprimeerd. Veel factoren zijn van invloed op het verlies van gegevens in het compressieproces; maar hoe complexer de oorspronkelijke gegevens en hoe hoger de compressieverhouding, hoe meer details verloren gaan in het compressieproces.

In de VBR-modus op basis van kwaliteit definieert u geen bitsnelheid of een buffervenster dat de encoder moet volgen. In plaats daarvan geeft u een kwaliteitsniveau op voor een digitale mediastroom in plaats van een bitsnelheid. De encoder comprimeert de inhoud zodat alle steekproeven van vergelijkbare kwaliteit zijn; dit zorgt ervoor dat de kwaliteit consistent is gedurende de afspeelduur, ongeacht de buffervereisten van de resulterende stream.

VBR-codering op basis van kwaliteit maakt meestal grote gecomprimeerde streams. Over het algemeen is dit type codering geschikt voor lokale afspeel- of netwerkverbindingen met een hoge bandbreedte (of downloaden en afspelen). U kunt bijvoorbeeld een toepassing schrijven om nummers van CD naar ASF-bestanden op een computer te kopiëren. Door op kwaliteit gebaseerde VBR-codering te gebruiken, zorgt u ervoor dat alle gekopieerde nummers van dezelfde kwaliteit zijn. In die gevallen biedt de consistente kwaliteit een betere gebruikerservaring.

Het nadeel van VBR-codering op basis van kwaliteit is dat er geen manier is om de grootte- of bandbreedtevereisten van de gecodeerde media vóór de coderingssessie te kennen, omdat de encoder één coderingspas gebruikt. Dit kan ervoor zorgen dat op kwaliteit gebaseerde VBR-gecodeerde bestanden ongepast zijn voor omstandigheden waarin het geheugen of de bandbreedte wordt beperkt, zoals het afspelen van inhoud op draagbare mediaspelers of het streamen via een netwerk met lage bandbreedte.

De encoder configureren voor Quality-Based VBR-codering

Configuratie van encoders wordt ingesteld via eigenschapswaarden. Deze eigenschappen worden gedefinieerd in wmcodecdsp.h. De configuratie-eigenschappen moeten worden ingesteld op de encoder voordat u het uitvoermediatype onderhandelt. Zie De encoder configurerenvoor meer informatie over het instellen van eigenschappen voor de encoder.

De volgende lijst bevat de eigenschappen die u moet instellen voor dit type codering:

  • Geef de VBR-coderingsmodus op door de eigenschap MFPKEY_VBRENABLED in te stellen op VARIANT_TRUE.
  • Stel de MFPKEY_PASSESUSED in op 1 omdat voor deze VBR-modus één coderingspas wordt gebruikt.
  • Stel het gewenste kwaliteitsniveau (van 0 tot 100) in door de eigenschap MFPKEY_DESIRED_VBRQUALITY in te stellen. Op kwaliteit gebaseerde VBR codeert de inhoud niet volgens vooraf gedefinieerde bufferparameters. Dit kwaliteitsniveau dat voor de hele stream wordt onderhouden, ongeacht de vereisten voor bitsnelheid die het gevolg zijn.
  • Voor videostreams stelt u de gemiddelde bitsnelheid in op een niet-nulwaarde in het kenmerk MF_MT_AVG_BITRATE op het uitvoermediatype van de encoder. De nauwkeurige bitsnelheid wordt bijgewerkt nadat de coderingssessie is voltooid.

In het volgende codevoorbeeld ziet u de implementatie voor SetEncodingProperties. Met deze functie worden coderingseigenschappen op stroomniveau ingesteld voor CBR en 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;
}

ASF-coderingstypen