Partager via


Mettre en œuvre le contrôle de débit

Cette rubrique décrit comment les objets de pipeline personnalisés peuvent prendre en charge les taux de lecture variables, y compris la lecture inverse. Pour plus d’informations sur l’utilisation du contrôle de débit à partir d’une application, consultez Contrôle de débit.

Cette rubrique contient les sections suivantes :

Si vous écrivez un objet de pipeline Microsoft Media Foundation (source multimédia, transformation ou récepteur multimédia), vous devrez peut-être prendre en charge les taux de lecture variables. Pour ce faire, implémentez les interfaces suivantes :

  1. Implémentez l’interface IMFGetService .
  2. Prendre en charge le service MF_RATE_CONTROL_SERVICE . (Voir Interfaces de service.)
  3. Implémentez l’interface IMFRateSupport , qui obtient les taux de lecture pris en charge par l’objet.
  4. Implémentez l’interface IMFRateControl , qui obtient ou définit le taux de lecture.

Sources multimédias

Si une source multimédia prend en charge le contrôle de débit, elle doit implémenter IMFRateSupport et IMFRateControl. Sinon, la session multimédia signale que le taux de lecture minimal et maximal est de 1,0, quels que soient les autres composants du pipeline.

Le taux de lecture n’affecte pas les heures de présentation des échantillons, de sorte que la source multimédia ne doit pas ajuster ses horodatages. Au lieu de cela, l’horloge de présentation s’exécute à une vitesse plus rapide ou plus lente. Pour la lecture inverse, la source fournit des exemples dans l’ordre inverse, avec des horodatages décroissants.

Le paramètre fThin de la méthode IMFRateControl ::SetRate indique si la source multimédia doit effacer le contenu. L’amincissement s’applique principalement aux flux vidéo. En mode mince, la source supprime les images delta et ne fournit que des images clés. À des taux de lecture très élevés, la source peut ignorer certaines images clés (par exemple, fournir toutes les autres images clés).

La source n’a pas besoin de supprimer des échantillons audio en mode mince. Toutefois, à des taux de lecture très élevés, la source peut ne pas être en mesure de lire les données suffisamment rapidement pour remplir les exemples de requêtes du pipeline. Dans ce cas, la source peut avoir besoin de supprimer certaines données audio. Si c’est le cas, il doit tenter de fournir des échantillons audio proches dans le temps des exemples vidéo (en supposant que la source possède les deux types de flux).

Lorsqu’un flux passe d’un mode mince à un mode non mince, il envoie un événement MEStreamThinMode .

Lorsque la source multimédia termine un appel à SetRate, elle envoie l’événement MESourceRateChanged.

Pendant la lecture inverse :

  • La source multimédia fournit des exemples dans l’ordre inverse, sans ajuster les horodatages.
  • Les horodatages au sein d’un flux doivent diminuer de façon monotonique.
  • Le début du contenu est considéré comme la fin du flux. Une fois que chaque flux multimédia a livré le premier exemple dans le flux (autrement dit, heure de présentation = 0), il envoie l’événement MEEndOfStream .

Transformations Media Foundation

En général, une transformation Media Foundation (MFT) n’a pas besoin d’une prise en charge explicite du contrôle de débit, sauf si le MFT implémente la lecture inverse non mince.

Si un MFT n’implémente pas l’interface IMFRateSupport , la session multimédia suppose les éléments suivants :

  • Le MFT prend en charge les taux de lecture arbitaires pour la lecture vers l’avant, à la fois minces et non minces.
  • Le MFT prend en charge la lecture inverse mince, mais ne prend pas en charge la lecture inverse non mince.

Si l’une de ces conditions n’est pas vraie, le MFT doit implémenter IMFRateSupport et IMFRateControl.

Lecture inversée

La session multimédia peut être lue en sens inverse même si une ou plusieurs transformations du pipeline ne prennent pas explicitement en charge la lecture inverse.

Si un MFT n’expose pas l’interface IMFRateSupport, la session multimédia utilise l’amincissement pour la lecture inverse, comme suit :

  • La session multimédia envoie des images clés au MFT de la manière habituelle, en appelant IMFTransform ::P rocessInput.

  • La session multimédia supprime les images delta et les remplace par les événements MEStreamTick .

  • Entre chaque exemple, la session multimédia vide le MFT pour éviter toute erreur causée par le fait que les horodatages diminuent.

Un exemple est considéré comme une image clé si l’attribut MFSampleExtension_CleanPoint a la valeur TRUE et est considéré comme un frame delta si cet attribut a la valeur FALSE ou non défini.

Si le MFT implémente IMFRateSupport, la session multimédia utilise cette interface pour déterminer si le MFT prend en charge la lecture inverse non mince. Si le MFT prend en charge la lecture inverse non mince, la session multimédia remet tous les exemples, dans l’ordre inverse, sans supprimer d’échantillons ou vider le MFT.

Si un MFT prend en charge la lecture inverse non mince, il doit implémenter l’interface IMFRateControl . La session multimédia utilise cette interface pour notifier le MFT lors de la lecture inversée. À ce stade, le MFT doit être préparé pour que les horodatages diminuent et que les images delta arrivent dans l’ordre inverse. Un décodeur doit généralement mettre en mémoire tampon des échantillons jusqu’à ce qu’il ait reçu un groupe entier d’images (GOP), puis décoder l’intégralité du GOP et générer les images décodées dans l’ordre correct (inverse).

Récepteurs multimédias

Si un récepteur multimédia est sans débit, la session multimédia suppose que le récepteur multimédia peut gérer n’importe quel taux de lecture. Le récepteur multimédia n’a pas besoin d’implémenter IMFRateSupport. (Un récepteur multimédia sans débit retourne l’indicateur de MEDIASINK_RATELESS à partir du IMFMediaSink ::GetCharacteristics method.)

Sinon, un récepteur multimédia doit implémenter IMFRateSupport s’il peut gérer les taux de lecture autres que 1,0.

Les récepteurs multimédias ne doivent pas implémenter IMFRateControl. Lorsque le taux de lecture change, l’horloge de présentation appelle la méthode IMFClockStateSink ::OnClockSetRate du récepteur multimédia.

Contrôle de débit

Recherche, Avance rapide et lecture inversée