Création d’un graphe de capture audio

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Elle a été remplacée par MediaPlayer, IMFMediaEngine et Capture audio/vidéo dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Si possible, Microsoft recommande vivement d’utiliser MediaPlayer, IMFMediaEngine et Capture audio/vidéo dans Media Foundation pour le nouveau code, plutôt que DirectShow. Microsoft recommande, si possible, la réécriture du code existant qui utilise les API héritées pour être à jour avec les nouvelles API.]

La première étape pour une application de capture audio consiste à construire un graphe de filtres. La configuration du graphe dépend du type de fichier que vous souhaitez créer.

  • Fichier AVI audio uniquement : filtre de capture audio au filtre AVI Mux, et AVI Mux au filtre File Writer.
  • Fichier WAV : filtre de capture audio au filtre WavDest Sample au filtre File Writer.
  • Fichier Windows Media Audio (.wma) : filtre de capture audio au filtre WM ASF Writer.

Le filtre WavDest est fourni en tant qu’exemple dans le SDK. Pour l’utiliser, vous devez construire et enregistrer le filtre.

Pour utiliser le filtre ASF Writer, vous devez installer le Windows Media SDK et obtenir une clé logicielle pour déverrouiller le filtre. Pour plus d’informations, veuillez consulter la section Utilisation de Windows Media dans DirectShow.

Vous pouvez construire le graphe de filtres en utilisant l’objet Capture Graph Builder, ou vous pouvez construire le graphe « manuellement » ; c’est-à-dire que l’application ajoute et connecte chaque filtre par programmation. Cet article décrit l’approche manuelle. Pour plus d’informations sur l’utilisation de Capture Graph Builder, veuillez consulter la section Capture vidéo. Beaucoup des informations contenues dans cet article s’appliquent aux graphes audio uniquement.

Ajout du périphérique de capture audio

Étant donné que le filtre de capture audio communique avec un périphérique matériel spécifique, vous ne pouvez pas simplement appeler CoCreateInstance pour créer le filtre. Au lieu de cela, utilisez le System Device Enumerator pour énumérer tous les périphériques dans la catégorie « Sources de capture audio », qui est identifiée par l’identificateur de classe CLSID_AudioInputDeviceCategory.

Le System Device Enumerator renvoie une liste de monikers pour les périphériques ; le nom convivial de chaque moniker correspond au nom du périphérique. Choisissez l’un des monikers retournés et utilisez-le pour créer une instance du filtre de capture audio pour ce périphérique. Ajoutez le filtre au graphe de filtres. Le périphérique d’enregistrement audio préféré de l’utilisateur apparaît en premier dans la liste des monikers. (L’utilisateur sélectionne un périphérique préféré en cliquant sur Sons et multimédia dans le Panneau de configuration).

Pour plus d’informations, veuillez consulter la section Utilisation de System Device Enumerator.

Pour spécifier l’entrée à partir de laquelle capturer, obtenez l’interface IAMAudioInputMixer à partir du filtre de capture audio et appelez la méthode put_Enable pour spécifier l’entrée. Une limitation de cette méthode est cependant que différents périphériques matériels peuvent utiliser des chaînes différentes pour identifier leurs entrées. Par exemple, une carte peut utiliser « Microphone » pour identifier l’entrée du microphone et une autre carte peut utiliser « Mic ». Pour déterminer l’identifiant de chaîne pour une entrée donnée, utilisez les fonctions Windows Multimedia waveOutOpen, mixerOpen, et mixerGetLineInfo. Veuillez consulter la section Interrogations de périphériques de mixage pour plus d’informations.

Ajout du multiplexeur et du récepteur de fichier

Un graphe de capture audio doit contenir un multiplexeur et un récepteur de fichier.

Un multiplexeur est un filtre qui combine un ou plusieurs flux en un flux unique avec un format particulier. Par exemple, le filtre AVI Mux combine des flux audio et vidéo en un flux AVI entrelacé. Pour la capture audio, il y a généralement un seul flux audio, mais les données audio doivent tout de même être emballées dans un format pouvant être sauvegardé sur disque, ce qui nécessite un multiplexeur. Le choix du multiplexeur dépend du format cible :

  • AVI : Multiplexeur AVI
  • WAV : WavDest
  • WMA : ASF Writer

Un récepteur de fichier est un filtre qui écrit les données entrantes dans un fichier. Pour les fichiers AVI ou WAV, utilisez le filtre File Writer. Pour les fichiers WMA, l’ASF Writer agit à la fois comme multiplexeur et récepteur de fichier.

Après avoir créé les filtres et les avoir ajoutés au graphe, connectez la broche de sortie du filtre de capture audio à la broche d’entrée du multiplexeur, et connectez la broche de sortie du multiplexeur à la broche d’entrée du récepteur de fichier (en supposant qu’il s’agit de filtres distincts). Pour spécifier le nom du fichier, interrogez le récepteur de fichier pour l’interface IFileSinkFilter et appelez la méthode IFileSinkFilter::SetFileName.

Exemple de code

L’exemple suivant montre comment construire un graphe de capture audio en utilisant le filtre WavDest. Les mêmes principes s’appliquent pour les autres types de fichiers.

IBaseFilter *pSrc = NULL, *pWaveDest = NULL, *pWriter = NULL;
IFileSinkFilter *pSink= NULL;
IGraphBuilder *pGraph;

// Create the Filter Graph Manager.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
    IID_IGraphBuilder, (void**)&pGraph);

// This example omits error handling.

// Not shown: Use the System Device Enumerator to create the 
// audio capture filter.

// Add the audio capture filter to the filter graph. 
hr = pGraph->AddFilter(pSrc, L"Capture");

// Add the WavDest and the File Writer.
hr = AddFilterByCLSID(pGraph, CLSID_WavDest, L"WavDest", &pWaveDest);
hr = AddFilterByCLSID(pGraph, CLSID_FileWriter, L"File Writer", &pWriter);

// Set the file name.
hr = pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pSink);
hr = pSink->SetFileName(L"C:\\MyWavFile.wav", NULL);

// Connect the filters.
hr = ConnectFilters(pGraph, pSrc, pWaveDest);
hr = ConnectFilters(pGraph, pWaveDest, pWriter);

// Not shown: Release interface pointers.

Cet exemple utilise la fonction AddFilterByCLSID décrite dans Ajouter un filtre par CLSID, et la fonction ConnectFilters décrite dans Connecter deux filtres. Aucune de ces fonctions n’est une API DirectShow.

Capture audio