Partager via


Encodage de débit binaire constant

Dans l’encodage CBR (Constant Bit Rate), l’encodeur connaît le taux de bits des exemples de supports de sortie et la fenêtre de mémoire tampon (paramètres de compartiment fuite) avant le début de la session d’encodage. L’encodeur utilise le même nombre de bits pour encoder chaque seconde d’échantillon tout au long de la durée du fichier afin d’atteindre le taux de bits 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 taux de bits cible.

L’encodage CBR est utile lorsque vous souhaitez connaître le taux de bits ou la durée approximative d’un fichier sans analyser l’intégralité du fichier. Cela est nécessaire dans les scénarios de diffusion en continu en direct où le contenu multimédia doit être diffusé en continu à 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, les parties d’un flux CBR seront de qualité inférieure à d’autres. Par exemple, un film typique comporte des scènes assez statiques et certaines scènes 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 la qualité d’un fichier CBR sont plus prononcées à des taux de bits inférieurs. À des taux de bits plus élevés, la qualité d’un fichier codé en CBR varie toujours, mais les problèmes de qualité sont moins visibles 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 l’autorise.

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 par le biais de 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 taux de bits d’encodage.

    Pour l’encodage CBR, vous devez connaître le débit de bits auquel vous souhaitez encoder le flux avant le début de la session d’encodage. Vous devez définir le débit de bits pendant que vous configurez l’encodeur. Pour ce faire, pendant que vous effectuez une négociation de type multimédia, vérifiez 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 de supports de sortie disponibles et choisissez un type de média de sortie qui a le taux de bits moyen le plus proche du taux de bits cible que vous souhaitez atteindre. Pour plus d’informations, consultez négociation de type de mé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 fuite

Pour l’encodage CBR, la moyenne et les valeurs maximales de compartiment fuite pour le flux sont identiques. Pour plus d’informations sur ces paramètres, consultez Modèle de mémoire tampon de compartiment fuite.

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

Pour définir des valeurs de compartiment fuite, créez un tableau de DWORDs peut 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 lerécepteur de fichiers.

types d’encodage ASF

Didacticiel : d’encodage Windows Media 1 pass

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