Peak-Constrained Codage à débit variable
Dans le taux de transmission variable à contrainte maximale (VBR), le contenu est encodé selon une vitesse de transmission et des valeurs de pointe spécifiées : un débit maximal et une fenêtre de mémoire tampon de pointe. Ces valeurs de pointe sont également appelées valeurs de compartiment de fuite maximale. Le fichier est encodé pour être conforme à une mémoire tampon décrite par les valeurs de pointe, de sorte que la vitesse de transmission moyenne globale du flux est égale ou inférieure à la valeur de débit moyenne que vous avez spécifiée.
En règle générale, le débit maximal est assez élevé. L’encodeur garantit que la valeur de débit moyenne spécifiée est conservée sur la durée du flux (débit >moyen = (taille totale du flux en bits / durée du flux en secondes)). Prenons l’exemple suivant : vous configurez un flux avec un débit moyen de 16 000 bits par seconde, un débit maximal de 48 000 bits par seconde et une fenêtre de mémoire tampon maximale de 3 000 (3 secondes). La taille de la mémoire tampon utilisée pour le flux est de 144 000 bits (48 000 bits par seconde * 3 secondes) comme déterminé par les valeurs maximales. L’encodeur compresse les données pour qu’elles soient conformes à cette mémoire tampon. En outre, le débit binaire moyen du flux doit être inférieur ou égal à 16 000. Si l’encodeur doit créer des exemples volumineux pour gérer un segment complexe de contenu, il peut tirer parti de la grande taille de la mémoire tampon. Toutefois, d’autres parties du flux doivent être encodées à un débit inférieur pour ramener la moyenne au niveau spécifié. L’encodage VBR à contrainte maximale est utile pour les appareils de lecture avec une capacité de mémoire tampon et des contraintes de débit de données limitées. Un exemple courant de ceci est l’encodage utilisé pour les DVD lorsque le décodage est effectué par une puce dans un appareil, où il existe des limitations matérielles qui doivent être prises en compte.
Configuration de l’encodeur pour Peak-Constrained VBR
Le VBR avec contrainte maximale est semblable à un VBR sans contrainte, car il est limité à un débit binaire moyen sur la durée du flux. En outre, le VBR limité par les pics est conforme à une mémoire tampon de pointe. Cette mémoire tampon est décrite à l’aide d’une vitesse de transmission maximale et d’une fenêtre de mémoire tampon de pointe. Ce mode utilise deux passes d’encodage et offre à l’encodeur une flexibilité dans la façon dont il encode des échantillons individuels tout en respectant les limitations maximales.
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 média de sortie. Pour plus d’informations sur la définition des propriétés sur l’encodeur, consultez Configuration de l’encodeur. En fonction des valeurs de propriété spécifiées, vous pouvez énumérer les types de sortie VBR pris en charge et sélectionner celui requis sur l’encodeur Media Foundation transform (MFT) en fonction du débit binaire moyen.
Vous devez définir les propriétés suivantes 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 2, car le mode VBR avec contrainte maximale utilise deux passes d’encodage.
- Définissez MFPKEY_RMAX pour spécifier la vitesse de transmission maximale et définissez MFPKEY_BMAX pour spécifier la fenêtre de mémoire tampon de pointe.
- Lors de l’énumération du type de média de sortie, 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 de mé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 moyen souhaité que l’encodeur doit conserver dans le contenu codé. Pour plus d’informations sur la sélection du type de média de sortie, consultez Négociation du type de média sur l’encodeur.
Notes
Il est recommandé de définir la vitesse de transmission maximale sur au moins deux fois le débit binaire moyen. Si vous définissez la vitesse maximale sur une valeur inférieure, l’encodeur peut encoder le contenu en tant que CBR à deux passes au lieu d’un VBR avec contrainte maximale.
Pour obtenir la valeur de la fenêtre de mémoire tampon définie par l’encodeur, appelez IWMCodecLeakyBucket::GetBufferSizeBits, défini dans wmcodecifaces.h, wmcodecdspuuid.lib, après la session d’encodage. Pour ajouter la prise en charge de VBR sans contrainte pour les flux, vous devez définir cette valeur dans l’attribut MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (valeurs de compartiment de fuite maximale) sur l’objet de configuration de flux lors de la configuration du profil ASF.
L’exemple de code suivant modifie la méthode SetEncodingType de l’exemple de classe CEncoder pour configurer le mode VBR à contrainte maximale. Pour plus d’informations sur cette classe, consultez Code d’exemple d’encodeur. Pour plus d’informations sur les macros d’assistance utilisées dans cet exemple, consultez Utilisation des exemples de code Media Foundation.
//////////////////////////////////////////////////////////////////////////
// Name: SetEncodingType
// Description: Sets the encoding type to peak-constrained VBR mode.
//
/////////////////////////////////////////////////////////////////////////
HRESULT CEncoder::SetEncodingType(EncodeMode mode)
{
if (!m_pMFT)
{
return MF_E_NOT_INITIALIZED;
}
HRESULT hr = S_OK;
IPropertyStore* pProp = NULL;
PROPVARIANT var;
PropVariantInit(&var);
// Query the encoder for its property store.
CHECK_HR(hr = m_pMFT->QueryInterface(__uuidof(IPropertyStore), (void**)&pProp));
if (mode == EncodeMode_VBR_Peak)
{
// Set the VBR property to TRUE, which indicates VBR encoding.
var.vt = VT_BOOL;
var.boolVal = TRUE;
CHECK_HR(hr = pProp->SetValue(MFPKEY_VBRENABLED, var));
PropVariantClear(&var);
// Set number of passes.
var.vt = VT_I4;
var.lVal =2;
CHECK_HR(hr = pProp->SetValue(MFPKEY_PASSESUSED, var));
PropVariantClear(&var);
// Set the peak bit rate.
var.vt = VT_I4;
var.lVal =48000;
CHECK_HR(hr = pProp->SetValue(MFPKEY_RMAX, var));
PropVariantClear(&var);
// Set the peak buffer window.
var.vt = VT_I4;
var.lVal =3000;
CHECK_HR(hr = pProp->SetValue(MFPKEY_BMAX, var));
PropVariantClear(&var);
}
done:
PropVariantClear(&var);
SAFE_RELEASE (pProp);
return hr;
}
Rubriques connexes