Encodage à débit variable sans contrainte

En mode d’encodage VBR (Variable Bit Rate) sans contrainte, le contenu est encodé avec la qualité la plus élevée possible tout en conservant un débit binaire spécifié.

L’encodage VBR sans contrainte utilise deux passes d’encodage. Lorsque vous utilisez l’encodage VBR sans contrainte, vous spécifiez un débit binaire pour le flux, comme vous le feriez avec l’encodage à débit constant. Toutefois, l’encodeur utilise cette valeur uniquement comme débit binaire moyen pour le flux et encode afin que la qualité soit la plus élevée possible tout en conservant la moyenne. La taille des échantillons individuels produits par l’encodeur varie sans limite de mémoire tampon explicite. Toutefois, la vitesse de transmission moyenne pendant la session d’encodage et la durée du flux ne doivent pas être supérieures à la valeur spécifiée par vous. Le débit binaire réel à n’importe quel point du flux encodé peut varier considérablement par rapport à la valeur moyenne. Vous ne définissez pas de fenêtre de mémoire tampon pour l’encodage VBR sans contrainte. Au lieu de cela, l’encodeur calcule la taille de la fenêtre de mémoire tampon requise en fonction des exigences des exemples codés. Cela signifie qu’il n’existe aucune limite à la taille des échantillons individuels dans le flux, tant que le débit binaire moyen est inférieur ou égal à la valeur que vous avez définie.

L’avantage de l’encodage VBR sans contrainte est que le flux compressé a la qualité la plus élevée possible tout en restant dans une bande passante moyenne prévisible. Utilisez cette option lorsque vous devez spécifier une bande passante, mais que les fluctuations autour de la bande passante spécifiée sont acceptables ; par exemple, pour les fichiers locaux ou le téléchargement uniquement.

L’inconvénient de ce mode d’encodage est que l’encodeur peut définir la fenêtre de mémoire tampon sur la valeur requise après l’encodage, ce qui ne vous donne aucun contrôle sur la taille de la mémoire tampon. Dans la plupart des cas, si vous n’êtes pas préoccupé par la taille de la mémoire tampon ou la cohérence de l’utilisation de la bande passante, vous devez utiliser l’encodage de débit variable basé sur la qualité

Configuration de l’encodeur pour VBR sans contrainte

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.

La liste suivante présente 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 la MFPKEY_PASSESUSED sur 2, car le mode VBR sans contrainte utilise deux passes d’encodage.
  • 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. Choisissez un type de média de sortie dont la vitesse de transmission moyenne est la plus proche de la vitesse de transmission moyenne souhaitée que l’encodeur doit conserver dans le contenu encodé. 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.

Pour obtenir que la valeur de la fenêtre de mémoire tampon soit définie par l’encodeur, appelez IWMCodecLeakyBucket::GetBufferSizeBits, défini dans wmcodecifaces.h et 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_LEAKYBUCKET1 (valeurs de compartiments fuites moyennes) sur l’objet de configuration de flux lors de la configuration du profil ASF.

L’exemple suivant modifie la méthode SetEncodingType de l’exemple de classe CEncoder pour configurer le mode VBR sans contrainte. 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 unconstrained VBR
//
/////////////////////////////////////////////////////////////////////////

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_Unconstrained)
    {
        //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);
    }

done:
    PropVariantClear(&var);
    SAFE_RELEASE (pProp);
    return hr;
    
}

Types d’encodage ASF

Modèle de mémoire tampon de compartiment qui fuit

Guide pratique pour créer une topologie pour Two-Pass l’encodage Windows Media