Partage de données entre des flux
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si 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.]
Notes
Ces API sont déconseillées. Les applications doivent utiliser le filtre Sample Grabber ou implémenter un filtre personnalisé pour obtenir des données à partir d’un graphique de filtre DirectShow.
Le traitement des données multimédias nécessite généralement une grande quantité de ressources système ; Par conséquent, vous devez éviter de copier des données dans la mesure du possible. L’architecture de streaming prend en charge les exemples de flux partagés, un mécanisme qui déplace les données d’un flux à un autre sans les copier. Cette mémoire tampon permet le transport efficace des données entre deux flux, même si le flux de destination ne prend pas spécifiquement en charge le format de données sous-jacent.
Par exemple, supposons que vous ayez un flux multimédia avec trois flux de données : vidéo et audio, et des données d’URL horodatées pour correspondre au contenu vidéo. Vous souhaitez écrire une application qui ajoute une mention de copyright sur chaque image vidéo et écrit les données dans un autre flux à des fins de stockage, mais votre application ne comprend aucun format de données à l’exception du flux vidéo. Pour le flux vidéo, vous créez un exemple attaché à la surface DirectDraw souhaitée. Vous pouvez ensuite créer un flux de sortie en appelant la méthode IDirectDrawMediaStream::CreateSample avec ce pointeur vers la même surface, ou IMediaStream::CreateSharedSample. Dans les deux cas, les flux d’entrée et de sortie partagent la surface DirectDraw. Étant donné que vous comprenez le format vidéo, vous pouvez accéder à cette surface en fonction des besoins.
Pour récupérer les autres pointeurs de flux source (audio et URL), énumérez le flux de conteneur source et récupérez les pointeurs vers les flux non vidéo. Chacun de ces flux sources a un flux de sortie associé dans le conteneur de flux de sortie. Récupérez ces pointeurs de sortie en appelant la méthode IMultiMediaStream::GetMediaStream sur le conteneur de sortie avec chacun des pointeurs de flux source. Les étapes de ce processus sont décrites ci-dessous.
- Appelez IMultiMediaStream::EnumMediaStreams pour récupérer un pointeur vers un flux source. Assurez-vous qu’il ne s’agit pas du flux vidéo, car votre application comprend déjà son format.
- Appelez IMultiMediaStream::GetMediaStream sur le flux de conteneur de sortie avec le pointeur de l’étape 1. Cela retourne un pointeur vers le flux de sortie souhaité.
- Appelez AllocateSample sur le flux source.
- Appelez CreateSharedSample sur le flux de sortie.
- Appelez Update sur le flux source pour lire les données.
- Appelez Update sur le flux de sortie pour écrire les données.
Répétez ces étapes pour chaque flux dont le format n’est pas pris en charge. Lorsque les deux exemples ont terminé la mise à jour, le flux de sortie contient toutes les données du flux source et vous avez terminé.