Partager via


Création d’un graphique de capture audio

[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.]

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

Le filtre WavDest est fourni sous forme d’exemple sdk. Pour l’utiliser, vous devez générer et inscrire le filtre.

Pour utiliser le filtre ASF Writer, vous devez installer le Kit de développement logiciel (SDK) Windows Media et obtenir une clé logicielle pour déverrouiller le filtre. Pour plus d’informations, consultez Utilisation de Windows Media dans DirectShow.

Vous pouvez générer le graphe de filtre à l’aide de l’objet Capture Graph Builder , ou vous pouvez générer le graphe « manuellement » ; c’est-à-dire que l’application ajoute et connecte par programmation chaque filtre. Cet article décrit l’approche manuelle. Pour plus d’informations sur l’utilisation de Capture Graph Builder, consultez Capture vidéo. La plupart des informations contenues dans cet article s’appliquent aux graphiques 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. Utilisez plutôt l’énumérateur d’appareils système pour énumérer tous les appareils de la catégorie « Sources de capture audio », qui est identifiée par l’identificateur de classe CLSID_AudioInputDeviceCategory.

L’énumérateur d’appareils système retourne une liste de monikers pour les appareils ; le nom convivial de chaque moniker correspond au nom de l’appareil. Choisissez l’un des monikers retournés et utilisez-le pour créer une instance du filtre de capture audio pour cet appareil. Ajoutez le filtre au graphique de filtre. Le périphérique d’enregistrement audio préféré de l’utilisateur apparaît en premier dans la liste moniker. (L’utilisateur sélectionne un appareil par défaut en cliquant sur Sons et multimédia dans Panneau de configuration.)

Pour plus d’informations, consultez Utilisation de l’énumérateur de périphérique système.

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. Toutefois, l’une des limites de cette méthode est que différents périphériques matériels peuvent utiliser des chaînes différentes pour identifier leurs entrées. Par exemple, un carte peut utiliser « Microphone » pour identifier l’entrée du microphone et un autre carte peut utiliser « Micro ». Pour déterminer l’identificateur de chaîne d’une entrée donnée, utilisez les fonctions Multimédia Windows waveOutOpen, mixerOpen et mixerGetLineInfo. Pour plus d’informations, consultez la rubrique MSDN Mixer Device Requêtes .

Ajout du multiplexeur et de l’enregistreur de fichiers

Un graphe de capture audio doit contenir un multiplexeur et un enregistreur de fichiers.

Un multiplexeur est un filtre qui combine un ou plusieurs flux en un seul flux avec un format particulier. Par exemple, le filtre AVI Mux combine des flux audio et vidéo dans un flux AVI entrelacé. Pour la capture audio, il n’existe généralement qu’un seul flux audio, mais les données audio doivent toujours être empaquetées dans un format qui peut être enregistré sur le disque, ce qui nécessite un multiplexeur. Le choix du multiplexeur dépend du format cible :

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

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

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

Exemple de code

L’exemple suivant montre comment créer un graphe de capture audio à l’aide du filtre WavDest. Les mêmes principes s’appliquent aux 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 AddFilterByCLSID fonction décrite dans Ajouter un filtre par CLSID et la ConnectFilters fonction décrite dans Connecter deux filtres. Ni l’un ni l’autre n’est une API DirectShow.

Audio Capture