Partager via


Encodage à débit binaire constant

Dans l’encodage À débit binaire constant (CBR), l’encodeur connaît le débit des exemples de supports de sortie et la fenêtre de mémoire tampon (paramètres de compartiment qui fuient) avant le début de la session d’encodage. L’encodeur utilise le même nombre de bits pour encoder chaque seconde d’échantillon pendant toute la durée du fichier afin d’atteindre le débit binaire cible d’un flux. Cela limite la variation de la taille des exemples de flux. En outre, pendant la session d’encodage, le débit binaire n’est pas exactement à la valeur spécifiée, mais reste proche du débit cible.

L'encodage en mode CBR est utile quand vous voulez connaître le débit binaire ou la durée approximative d'un fichier sans analyser le fichier complet. Ceci est requis dans les scénarios de diffusion en continu dans lesquels le contenu multimédia doit être diffusé à un débit binaire prévisible et avec une utilisation cohérente de la bande passante.

L’inconvénient de l’encodage CBR est que la qualité du contenu encodé ne sera pas constante. Étant donné que certains contenus sont plus difficiles à compresser, certaines parties d’un flux CBR seront de qualité inférieure à d’autres. Par exemple, un film classique a certaines scènes qui sont assez statiques et certaines scènes qui sont pleines d’action. Si vous encodez un film à l’aide de CBR, les scènes statiques, et donc faciles à encoder efficacement, seront de meilleure qualité que les scènes d’action, ce qui aurait nécessité des tailles d’échantillon plus élevées pour maintenir la même qualité.

En général, les variations de qualité d’un fichier CBR sont plus marquées à des débits binaires inférieurs. À des débits binaires plus élevés, la qualité d’un fichier encodé en CBR varie toujours, mais les problèmes de qualité seront moins perceptibles pour l’utilisateur. Lorsque vous utilisez l’encodage CBR, vous devez définir la bande passante aussi élevée que votre scénario de livraison le permet.

Paramètres de configuration CBR

Vous devez configurer un encodeur en spécifiant le type d’encodage et les différents paramètres spécifiques au flux avant la session d’encodage.

Pour configurer l’encodeur pour l’encodage CBR

  1. Spécifiez le mode d’encodage CBR.

    Par défaut, l’encodeur est configuré pour utiliser l’encodage CBR. La configuration de l’encodeur est définie via des valeurs de propriété. Ces propriétés sont définies dans wmcodecdsp.h. Vous pouvez spécifier explicitement ce mode en définissant la propriété MFPKEY_VBRENABLED sur VARIANT_FALSE. Pour plus d’informations sur la définition des propriétés sur les encodeurs, consultez Configuration de l’encodeur.

  2. Choisissez le débit binaire d’encodage.

    Pour l’encodage CBR, vous devez connaître le débit binaire auquel vous souhaitez encoder le flux avant le début de la session d’encodage. Vous devez définir le débit binaire pendant la configuration de l’encodeur. Pour ce faire, pendant que vous effectuez une négociation de type multimédia, case activée l’attribut MF_MT_AUDIO_AVG_BYTES_PER_SECOND (pour les flux audio) ou l’attribut MF_MT_AVG_BITRATE (pour les flux vidéo) des types multimédias de sortie disponibles et choisissez un type de média de sortie dont le débit moyen est le plus proche du débit binaire cible que vous souhaitez atteindre. Pour plus d’informations, consultez Négociation de type multimédia sur l’encodeur.

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;
}

Paramètres du compartiment d’fuite

Pour l’encodage CBR, les valeurs moyennes et maximales de compartiment d’fuite pour le flux sont les mêmes. Pour plus d’informations sur ces paramètres, consultez Le modèle de mémoire tampon de compartiment qui fuit.

Pour encoder des flux audio en CBR, vous devez définir les valeurs de compartiment qui fuient après avoir négocié le type de média de sortie sur l’encodeur. L’encodeur calcule la fenêtre de mémoire tampon en interne en fonction du débit binaire moyen défini sur le type de support de sortie.

Pour définir des valeurs de compartiment qui fuient, créez un tableau de DWORDs qui peuvent définir les valeurs suivantes dans la propriété MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET dans le magasin de propriétés du récepteur multimédia. Pour plus d’informations, consultez Définition des propriétés dans le récepteur de fichiers.

Types d’encodage ASF

Tutoriel : Encodage Windows Media à 1 passe

Tutoriel : Écriture d’un fichier WMA à l’aide de l’encodage CBR