Modèle de mémoire tampon de compartiment fuite (Microsoft Media Foundation)

Lorsque vous diffusez du contenu multimédia sur un réseau, le décodeur reçoit des données encodées à un débit théoriquement constant (taux de transmission). Le décodeur consomme ces données pour produire une sortie décodée. Dans le cas général, toutefois, le décodeur consomme les données à un taux variable , car l’encodeur peut alors utiliser un taux d’encodage variable.

Le modèle « compartiment qui fuit » est un moyen de modéliser les exigences de mise en mémoire tampon pour une lecture fluide. Dans ce modèle, le décodeur gère une mémoire tampon. Les données encodées vont du réseau dans la mémoire tampon et de la mémoire tampon dans le décodeur. Si la mémoire tampon sous-flux, cela signifie que le décodeur supprime les données de la mémoire tampon plus rapidement que le réseau ne les remet. Si la mémoire tampon déborde, cela signifie que le réseau fournit des données plus rapidement que le décodeur ne les consomme.

Cette rubrique décrit le modèle de « compartiment fuite » de mémoires tampons pour l’encodage et le décodage.

Le seau qui fuit

Pour comprendre le modèle de seau qui fuit, envisagez un seau avec un petit trou au fond. Trois paramètres définissent le compartiment :

  • Capacité (B)
  • Vitesse à laquelle l’eau s’écoule hors du seau (R)
  • La plénitude initiale du compartiment (F)

Dans cette métaphore, le compartiment est la mémoire tampon :

illustration montrant une mémoire tampon sous forme de seau, le taux d’entrée en tant qu’eau entrant dans le seau et le taux de sortie en tant qu’eau sortant par un trou dans le seau

Si l’eau est versée dans le seau à la vitesse exacte R, le seau reste à F, car le taux d’entrée est égal au taux de sortie. Si le taux d’entrée augmente alors que R reste constant, le seau accumule de l’eau. Si le taux d’entrée est supérieur à R pendant une période prolongée, le compartiment finit par déborder. Toutefois, le taux d’entrée peut varier autour de R sans dépasser le compartiment, tant que le taux d’entrée moyen ne dépasse pas la capacité du compartiment. Plus la capacité est grande, plus le taux d’entrée peut varier dans une fenêtre de temps donnée.

Dans ASF, le compartiment qui fuit est défini par trois paramètres :

  • Débit binaire moyen, en octets par seconde, qui correspond au taux de sortie (R)
  • Fenêtre de mémoire tampon, mesurée en millisecondes, qui correspond à la capacité du compartiment (B).
  • Remplissage de la mémoire tampon initiale, qui est généralement défini sur zéro.

Le débit binaire mesure le nombre moyen de bits par seconde dans le flux codé. La fenêtre de mémoire tampon mesure le nombre de millisecondes de données à ce débit binaire qui peuvent tenir dans la mémoire tampon. La taille de la mémoire tampon en bits est égale à R * (B / 1000).

Les données de charge utile ASF peuvent entrer dans le compartiment qui fuit à des moments irréguliers et en quantités irrégulières, mais doivent laisser le compartiment à un débit binaire positif constant. En raison de la fenêtre de mémoire tampon, il existe un délai possible entre le moment où la charge utile entre dans le compartiment et le moment où elle quitte. Le délai maximal qui peut se produire est B/R. Les données de charge utile qui entrent dans le compartiment sont en fonction de l’heure de présentation et ne doivent jamais dépasser le compartiment. En plus de l’heure de présentation, chaque charge utile a également une heure d’envoi, c’est-à-dire l’heure à laquelle les données de charge utile quittent le compartiment en fonction du débit binaire. L’heure d’envoi doit être antérieure à l’heure de présentation pour s’assurer que chaque charge utile quitte le compartiment avant ou au moment de la présentation. Pour ce faire, les heures de présentation sont décalées par la valeur B/R ( le préroll), et les temps d’envoi obtiennent une avance commençant à zéro. L’heure d’envoi ne doit pas être ultérieure à l’heure de présentation, car cela indiquerait que la charge utile est entrée trop tard dans le compartiment et ne peut pas être incluse dans l’objet de données. La valeur de pré-inscription est incluse dans l’objet d’en-tête ASF .

Pour la diffusion en continu sans problème sur le réseau, les flux compressés dans le contenu multimédia doivent maintenir un débit binaire constant tout au long de la durée de lecture. Le modèle de compartiment de fuite ASF garantit que les données multimédias sont envoyées sur le réseau à un débit binaire constant. Les paramètres du compartiment qui fuit sont spécifiés dans l’objet Propriétés de flux étendu de l’objet d’en-tête ASF. Dans Microsoft Media Foundation, ils sont définis en tant qu’attributs sur le type de média qui représente le flux.

Les valeurs du compartiment qui fuient sont définies à la fois dans le récepteur de fichiers ASF et l’objet multiplexeur ASF sous-jacent, ainsi que dans l’encodeur Windows Media. Ces valeurs peuvent être identiques ou différentes. Par exemple, envisagez un scénario de diffusion en continu, qui nécessite que les exemples audio soient remis plus tard que les exemples vidéo afin que le fichier puisse être diffusé en continu sans latence. Pour ce faire, le compartiment fuite du flux audio dans le récepteur multimédia peut être défini sur une valeur supérieure à la valeur définie dans l’encodeur audio Windows Media.

Pour définir des valeurs B/R dans l’encodeur, l’application doit définir les propriétés MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX et MFPKEY_BMAX . Pour plus d’informations sur la définition des propriétés dans l’encodeur, consultez Propriétés d’encodage.

Compartiment utilisé

L’objectif d’un encodeur est de s’assurer que le contenu ne dépasse jamais la mémoire tampon. L’encodeur utilise les valeurs de vitesse de transmission et de fenêtre de mémoire tampon comme repères. Le nombre réel de bits passés sur une période de temps égale à la fenêtre de mémoire tampon ne peut jamais être supérieur à deux fois la taille de la mémoire tampon.

Prenons l’exemple suivant : vous avez un seau de 3 gallons avec un trou à travers lequel 1 gallon peut couler par minute. Vous mettez le seau sous un crachat et ouvrez la vanne pour laisser sortir l’eau à un débit de 1 gallon par minute. L’eau s’écoule du seau aussi rapidement qu’elle entre, ne laissant aucun supplément dans le seau. Ensuite, vous augmentez le débit du spigot à 2 gallons par minute. Chaque minute que l’eau s’écoule à ce rythme, 2 gallons vont dans le seau et 1 gallon s’écoule, laissant 1 gallon dans le seau. Au bout de 3 minutes, 6 gallons d’eau sont allés dans le seau, 3 gallons ont fui, et le seau est plein.

Dans la pratique, le débit de données maximal théorique sur un intervalle égal à la fenêtre de mémoire tampon n’est jamais atteint. L’exemple précédent supposait un débit de données constant. Étant donné le même seau de 3 gallons, vous pouvez augmenter le débit du spigot à 6 gallons par minute pendant une minute, puis l’éteindre pendant deux minutes. Même si la quantité totale d’eau placée dans le seau est inférieure au maximum théorique pour la fenêtre tampon, la concentration de cette quantité dans une partie de la fenêtre entraîne le débordement du seau. À 6 gallons par minute, le seau de 3 gallons déborde peu après le passage de 30 secondes. Par conséquent, la quantité maximale réelle de données pouvant être remises à la mémoire tampon pendant toute la durée de n’importe quel intervalle égal au paramètre de fenêtre de mémoire tampon dépend de la taille des échantillons individuels et du moment où ils sont remis.

Jusqu’à présent, les exemples n’ont abordé que la mémoire tampon utilisée par le décodeur, mais une mémoire tampon de compartiment qui fuit est également utilisée par l’encodeur qui crée le contenu compressé. L’encodeur effectue les ajustements nécessaires aux algorithmes de compression pour conserver la vitesse de transmission des exemples compressés dans les limites décrites par la fenêtre de débit et de mémoire tampon, en supposant que les exemples seront remis au décodeur à une vitesse constante. Vous pouvez considérer le compartiment d’encodeur comme une mise en miroir du compartiment de décodeur. Le compartiment d’encodeur est rempli à un taux variable déterminé par la taille des échantillons individuels et les fuites à un taux constant égal au débit binaire moyen.

Prenons l’exemple suivant d’un encodeur et d’un décodeur connectés ensemble sur un réseau. Vous encodez un fichier vidéo à 30 images par seconde avec un débit de 6 000 bits par seconde et une fenêtre de mémoire tampon de 3 secondes (une taille totale de mémoire tampon de 18 000 bits). Le premier exemple est encodé en tant que trame clé et prend jusqu’à 7 000 bits. La mémoire tampon de l’encodeur contient désormais 7 000 bits. Les 29 images suivantes sont toutes des images delta qui totalent 3 000 bits. Ainsi, la première seconde de contenu (30 images) placerait la mémoire tampon à 10 000 bits si rien ne fuyait. Nous savons que la vitesse de transmission du flux est de 6 000 bits par seconde. Ainsi, une fois que la première seconde du contenu encodé est placée dans la mémoire tampon de l’encodeur, la pleineté tombe à 4 000 bits. Dans l’application de décodage, ce flux est remis à la mémoire tampon du décodeur à 6 000 bits par seconde. Après une seconde, la mémoire tampon contient 6 000 bits. Le premier échantillon contient 7 000 bits, de sorte que la mémoire tampon du décodeur doit être remplie plus avant que le décodeur commence à supprimer les échantillons.

Définition de valeurs de compartiment fuite pour les flux ASF

Dans un scénario d’encodage de fichier, une application peut définir les valeurs de compartiment qui fuient lors de la configuration des flux dans le profil ASF.

Après avoir créé le flux et avoir une référence à l’interface IMFASFStreamConfig du flux, vous pouvez définir les valeurs à l’aide des attributs suivants :

Pour plus d’informations sur l’ajout de flux et l’obtention du pointeur IMFASFStreamConfig , consultez Ajout d’informations de flux au récepteur de fichiers ASF.

Ces valeurs contiennent l’ensemble d’informations suivant :

  • Débit moyen : obtenez le débit moyen à partir du type de média de sortie sélectionné lors de la négociation du type de média. Utilisez 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).
  • Fenêtre tampon : si vous avez un instance de l’encodeur et que vous avez négocié des types de média de sortie, vous pouvez mettre à jour cette valeur ultérieurement en interrogeant l’encodeur pour l’interface IWMCodecLeakyBucket, puis en appelant IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib). Sinon, utilisez la valeur par défaut de 3 000 millisecondes.
  • Taille initiale de la mémoire tampon : définie sur 0.

Les valeurs fournies par l’application dépendent du type d’encodage et du type de média du flux. Par exemple, l’encodage à débit binaire constant nécessite un débit fixe prédéterminé et une fenêtre de mémoire tampon. L’application peut spécifier ces valeurs de compartiment qui fuient en définissant la propriété d’encodage MFPKEY_VIDEOWINDOW et l’attribut MF_ASFSTREAMCONFIG_LEAKYBUCKET1 sur le flux. Les valeurs de fenêtre de mémoire tampon spécifiées sont utilisées pour s’assurer que le fichier encodé a les heures d’envoi correctes marquées sur les paquets de données et que la valeur de pré-inscription s’affiche dans l’objet d’en-tête ASF. Il suffit de définir MF_ASFSTREAMCONFIG_LEAKYBUCKET1 , car ces valeurs spécifiées sont copiées dans l’attribut MF_ASFSTREAMCONFIG_LEAKYBUCKET2 .

Pour les modes d’encodage à 2 passes, vous devez définir ces deux attributs pour spécifier les valeurs moyennes et maximales.

Pour l’encodage VBR, l’application peut interroger les valeurs de compartiment qui fuient utilisées par l’encodeur uniquement une fois le passage d’encodage terminé. Par conséquent, lors de la configuration du récepteur multimédia, l’application peut choisir de ne pas définir les attributs ou les propriétés liés aux compartiments qui fuient. Après l’encodage, l’application doit interroger l’encodeur pour connaître les propriétés MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX et MFPKEY_BMAX et les définir dans le récepteur multimédia afin que les valeurs exactes soient reflétées dans l’objet Header. Pour obtenir un exemple de code sur la façon de mettre à jour les valeurs pour l’encodage VBR, consultez « Mettre à jour les propriétés d’encodage dans le récepteur de fichiers » dans tutoriel : encodage Windows Media 1 passe.

Si vous copiez du contenu Windows Media de la source vers le récepteur multimédia sans encodage, les valeurs du compartiment qui fuit doivent être définies dans le récepteur multimédia.

Valeurs de compartiments qui fuient dans le multiplexeur ASF

Dans Media Foundation, les valeurs de compartiment qui fuient sont utilisées par le multiplexeur ASF pour configurer les valeurs de compartiment interne fuite qu’il utilise pour générer des paquets de données. La charge utile est contenue dans un échantillon de média et une série d’exemples de supports constitue un paquet de données ASF. En fonction des valeurs de compartiment qui fuient et de l’heure de présentation, le multiplexeur affecte une heure d’envoi pour chaque exemple de média afin que les débits binaires des paquets envoyés sur le réseau soient à un débit constant (R).

Une application ne peut pas définir directement des valeurs de compartiment qui fuient dans le multiplexeur. Les valeurs doivent être fournies sur le récepteur de média ASF, qui définit les valeurs appropriées sur le multiplexeur. Les valeurs définies dans MF_ASFSTREAMCONFIG_LEAKYBUCKET1 et MF_ASFSTREAMCONFIG_LEAKYBUCKET2 sont utilisées par le multiplexeur pour valider que les exemples envoyés au récepteur de média ASF sont générés à l’aide des valeurs spécifiées.

Mise à jour des valeurs de compartiment fuite dans le récepteur de média ASF

Une application peut remplacer les valeurs de compartiment fuite au niveau du flux (définies dans le profil ASF lors de la création du flux) en définissant la propriété MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET dans le magasin de propriétés du récepteur de média. Pour obtenir une référence au magasin de propriétés, utilisez l’objet ContentInfo implémenté par le récepteur multimédia. Pour plus d’informations, consultez Définition des propriétés dans le récepteur de fichiers.

Note Cette opération est uniquement autorisée pour les flux audio.

Cette propriété doit être définie après avoir défini le type de sortie sur l’encodeur. En fonction de la vitesse de transmission définie dans le type de média, l’encodeur calcule la taille de la mémoire tampon pour s’assurer que les exemples de média générés ne dépassent jamais la mémoire tampon. L’encodeur effectue les ajustements nécessaires pendant la compression pour conserver la vitesse de transmission des exemples compressés dans les limites décrites par la fenêtre de débit et de mémoire tampon.

À l’instar des attributs de configuration de flux pour les compartiments qui fuient, définissez la vitesse de transmission moyenne et la taille de la mémoire tampon, ainsi que l’intégralité de la mémoire tampon initiale dans un tableau de DWORDs. Pour plus d’informations, consultez la section « Définition de valeurs de compartiments fuites pour les flux ASF » dans cette rubrique.

Prise en charge d’ASF dans Media Foundation

Codecs Windows Media