encodage à débit variable Quality-Based

Contrairement à l’encodage à débit binaire constant (CBR), où l’encodeur s’efforce de maintenir un débit binaire particulier du média encodé, en mode débit binaire variable (VBR), l’encodeur s’efforce d’obtenir la meilleure qualité possible du média encodé. La principale différence entre CBR et VBR est la taille de la fenêtre de mémoire tampon utilisée. Les flux encodés en VBR ont généralement de grandes fenêtres de mémoire tampon par rapport aux flux encodés en CBR.

La qualité du contenu encodé est déterminée par la quantité de données perdues lors de la compression du contenu. De nombreux facteurs affectent la perte de données dans le processus de compression ; mais en général, plus les données d’origine sont complexes et plus le taux de compression est élevé, plus les détails sont perdus dans le processus de compression.

En mode VBR basé sur la qualité, vous ne définissez pas de débit binaire ou de fenêtre de mémoire tampon que l’encodeur doit suivre. Au lieu de cela, vous spécifiez un niveau de qualité pour un flux multimédia numérique au lieu d’un débit binaire. L’encodeur compresse le contenu afin que tous les exemples soient de qualité comparable ; cela garantit la cohérence de la qualité tout au long de la durée de lecture, quelles que soient les exigences de mémoire tampon du flux résultant.

L’encodage VBR basé sur la qualité tend à créer de grands flux compressés. En général, ce type d’encodage convient parfaitement pour la lecture locale ou les connexions réseau à bande passante élevée (ou pour le téléchargement et la lecture). Par exemple, vous pouvez écrire une application pour copier des chansons de CD vers des fichiers ASF sur un ordinateur. L’utilisation d’un encodage VBR basé sur la qualité garantit que toutes les chansons copiées sont de la même qualité. Dans ce cas, la qualité cohérente offre une meilleure expérience utilisateur.

L’inconvénient de l’encodage VBR basé sur la qualité est qu’il n’existe aucun moyen de connaître les exigences de taille ou de bande passante du média encodé avant la session d’encodage, car l’encodeur utilise une seule passe d’encodage. Cela peut rendre les fichiers encodés en VBR de qualité inappropriés dans les cas où la mémoire ou la bande passante sont limitées, comme la lecture de contenu sur des lecteurs multimédias portables ou la diffusion en continu sur un réseau à faible bande passante.

Configuration de l’encodeur pour Quality-Based encodage VBR

La configuration de l’encodeur est définie via des valeurs de propriété. Ces propriétés sont définies dans wmcodecdsp.h. Les propriétés de configuration doivent être définies sur l’encodeur avant de négocier le type de support de sortie. Pour plus d’informations sur la définition des propriétés sur l’encodeur, consultez Configuration de l’encodeur.

La liste suivante montre les propriétés que vous devez définir pour ce type d’encodage :

  • Spécifiez le mode d’encodage VBR en définissant la propriété MFPKEY_VBRENABLED sur VARIANT_TRUE.
  • Définissez le MFPKEY_PASSESUSED sur 1, car ce mode VBR utilise une seule passe d’encodage.
  • Définissez le niveau de qualité souhaité (de 0 à 100) en définissant la propriété MFPKEY_DESIRED_VBRQUALITY . VBR basé sur la qualité n’encode pas le contenu dans des paramètres de mémoire tampon prédéfinis. Ce niveau de qualité sera maintenu pour l’ensemble du flux, quelles que soient les exigences de débit binaire qui en résultent.
  • Pour les flux vidéo, définissez le débit binaire moyen sur une valeur différente de zéro dans l’attribut MF_MT_AVG_BITRATE sur le type de média de sortie de l’encodeur. Le débit binaire précis est mis à jour une fois la session d’encodage terminée.

L’exemple de code suivant montre l’implémentation de SetEncodingProperties. Cette fonction définit les propriétés d’encodage au niveau du flux pour CBR et 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;
}

Types d’encodage ASF