Partager via


Sources actives

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Une source dynamique, également appelée source push, reçoit des données en temps réel. Les exemples incluent la capture vidéo et les diffusions réseau. En général, une source dynamique ne peut pas contrôler la vitesse à laquelle les données arrivent.

Un filtre est considéré comme une source dynamique si l’une des conditions suivantes est vraie :

Si un filtre de source dynamique fournit une horloge, le Gestionnaire de graphes de filtre préférera cette horloge lorsqu’il choisit l’horloge de référence de graphe. Pour plus d’informations, consultez Horloges de référence .

Latence

La latence d’un filtre correspond au temps nécessaire au filtre pour traiter un exemple. Pour les sources actives, la latence est déterminée par la taille de la mémoire tampon utilisée pour contenir des exemples. Par exemple, supposons que le graphe de filtre a une source vidéo avec une latence de 33 millisecondes (ms) et une source audio avec une latence de 500 ms. Chaque image vidéo arrive au convertisseur vidéo d’environ 470 ms avant que l’exemple audio correspondant atteigne le convertisseur audio. À moins que le graphique ne compense la différence, l’audio et la vidéo ne seront pas synchronisés.

Les sources actives peuvent être synchronisées via l’interface IAMPushSource . Le Gestionnaire de graphes de filtre ne synchronise pas les sources actives, sauf si l’application active la synchronisation en appelant la méthode IAMGraphStreams::SyncUsingStreamOffset . Si la synchronisation est activée, le Gestionnaire de filtre Graph interroge chaque filtre source pour IAMPushSource. Si le filtre prend en charge IAMPushSource, filter Graph Manager appelle IAMLatency::GetLatency pour récupérer la latence attendue du filtre. (L’interface IAMPushSource hérite d’IAMLatency.) À partir des valeurs de latence combinées, le Gestionnaire de graphes de filtre détermine la latence maximale attendue dans le graphique. Il appelle ensuite IAMPushSource::SetStreamOffset pour donner à chaque filtre source un décalage de flux, que ce filtre ajoute aux horodatages qu’il génère.

Cette méthode est principalement destinée à la préversion en direct. Toutefois, notez qu’une broche d’aperçu sur un appareil de capture dynamique (par exemple, une caméra) ne définit pas d’horodatages sur les échantillons qu’elle fournit. Par conséquent, pour utiliser cette méthode avec un appareil de capture dynamique, vous devez afficher un aperçu à partir de l’épingle de capture. Pour plus d’informations, consultez Filtres de capture vidéo DirectShow.

Actuellement, l’interface IAMPushSource est prise en charge par le filtre capture VFW et le filtre Capture audio .

Correspondance de taux

Si un filtre de convertisseur planifie des exemples à l’aide d’une horloge de référence, mais que le filtre source les produit à l’aide d’une autre horloge, des problèmes peuvent se produire en lecture. Le convertisseur peut s’exécuter plus rapidement que la source, ce qui entraîne des lacunes dans les données. Il peut également s’exécuter plus lentement que la source, ce qui entraîne le « regroupement » des échantillons jusqu’à ce qu’à un moment donné, le graphique supprime les échantillons. En règle générale, une source dynamique ne peut pas contrôler son taux de production. Par conséquent, le convertisseur doit faire correspondre les taux à la source.

Actuellement, seul le convertisseur audio effectue la correspondance de débit, car les problèmes de lecture audio sont plus visibles que les problèmes dans la vidéo. Pour effectuer la correspondance de taux, le convertisseur audio doit sélectionner un élément par rapport auquel il fera correspondre les taux. Il utilise l’algorithme suivant :

  • Si le graphique n’utilise pas d’horloge de référence, le convertisseur audio n’essaie pas de faire correspondre les taux. (Chaque fois que le graphe n’a pas d’horloge de référence, les exemples sont toujours affichés immédiatement lorsqu’ils arrivent.)
  • Sinon, s’il existe une horloge de référence pour le graphe, le convertisseur audio vérifie s’il existe une source dynamique amont, en utilisant les critères décrits précédemment. Si ce n’est pas le cas, le convertisseur audio ne correspond pas aux tarifs.
  • S’il existe une source dynamique amont et que cette source expose l’interface IAMPushSource sur sa broche de sortie, le convertisseur audio appelle IAMPushSource::GetPushSourceFlags. Il recherche l’un des indicateurs suivants :
    • AM_PUSHSOURCECAPS_INTERNAL_RM. Cet indicateur signifie que le filtre source a son propre mécanisme de correspondance de débit, de sorte que le convertisseur audio ne correspond pas aux taux.
    • AM_PUSHSOURCECAPS_NOT_LIVE. Cet indicateur signifie que le filtre source n’est pas vraiment une source dynamique, même s’il expose l’interface IAMPushSource . Par conséquent, le convertisseur audio ne correspond pas aux tarifs.
    • AM_PUSHSOURCECAPS_PRIVATE_CLOCK. Cet indicateur signifie que le filtre source utilise une horloge privée pour générer des horodatages. Dans ce cas, le convertisseur audio correspond aux taux par rapport aux horodatages. (Si les exemples n’ont pas d’horodatage, toutefois, le convertisseur ignore cet indicateur.)
  • Si GetPushSourceFlags ne retourne aucun indicateur (zéro), le comportement du convertisseur audio dépend de l’horloge du graphique et de l’horodatage des exemples :
    • Si le convertisseur audio n’est pas l’horloge de graphe, ET que les exemples ont des horodatages, le convertisseur audio correspond aux taux par rapport aux horodatages.
    • Si les exemples n’ont pas d’horodatages, le convertisseur audio tente de faire correspondre le taux de données audio entrantes.
    • Si le convertisseur audio est l’horloge du graphique, il tente de faire correspondre le débit de données entrant.

La raison du dernier cas est la suivante : si le convertisseur audio est l’horloge de référence et que le filtre source utilise la même horloge pour générer des horodatages, le convertisseur audio ne peut pas faire correspondre les taux aux horodatages. Si c’était le cas, en fait, il tenterait de faire correspondre les taux à lui-même, ce qui pourrait entraîner une dérive de l’horloge. Par conséquent, dans ce cas, le convertisseur correspond au taux de données audio entrantes.

Heure et horloges dans DirectShow