Erstellen einer Audioaufnahme-Graph
Der erste Schritt für eine Audioerfassungsanwendung ist das Erstellen eines Filterdiagramms. Die Konfiguration des Diagramms hängt vom Typ der Datei ab, die Sie erstellen möchten.
- Rein audiobasierte AVI-Datei: Filter für Audioaufnahme nach AVI Mux-Filter und AVI Mux zu File Writer-Filter.
- WAV-Datei: Audio Capture Filter to WavDest Filter Sample to File Writer Filter
- Windows Medienaudiodatei (WMA): Audioaufnahmefilter für WM ASF Writer-Filter.
Der WavDest-Filter wird als SDK-Beispiel bereitgestellt. Um ihn zu verwenden, müssen Sie den Filter erstellen und registrieren.
Um den ASF Writer-Filter zu verwenden, müssen Sie das Windows Media SDK installieren und einen Softwareschlüssel abrufen, um den Filter zu entsperren. Weitere Informationen finden Sie unter Verwenden von Windows Medien in DirectShow.
Sie können das Filterdiagramm mithilfe des Capture Graph Builder-Objekts oder "manuell" erstellen. Das heißt, die Anwendung muss jeden Filter programmgesteuert hinzufügen und verbinden. In diesem Artikel wird der manuelle Ansatz beschrieben. Weitere Informationen zur Verwendung von Capture Graph Builder finden Sie unter Video capture. Ein Großteil der Informationen in diesem Artikel gilt für rein audiobasierte Diagramme.
Hinzufügen des Audioaufnahmegeräts
Da der Audioaufnahmefilter mit einem bestimmten Hardwaregerät kommuniziert, können Sie coCreateInstance nicht einfach aufrufen, um den Filter zu erstellen. Verwenden Sie stattdessen den Systemgeräte-Enumerator, um alle Geräte in der Kategorie "Audioaufnahmequellen" aufzuzählen, die durch den Klassenbezeichner CLSID _ AudioInputDeviceCategory identifiziert wird.
Der Systemgeräte-Enumerator gibt eine Liste von Monikern für die Geräte zurück. Der Anzeigename jedes Monikers entspricht dem Namen des Geräts. Wählen Sie einen der zurückgegebenen Moniker aus, und verwenden Sie ihn, um eine Instanz des Audioaufnahmefilters für dieses Gerät zu erstellen. Fügen Sie den Filter dem Filterdiagramm hinzu. Das bevorzugte Audioaufzeichnungsgerät des Benutzers wird zuerst in der Monikerliste angezeigt. (Der Benutzer wählt ein bevorzugtes Gerät aus, indem er in Systemsteuerung auf Sounds und Multimedia klickt.)
Weitere Informationen finden Sie unter Verwenden des Systemgeräte-Enumerators.
Rufen Sie zum Angeben der zu erfassenden Eingabe die IAMAudioInputMixer-Schnittstelle aus dem Audio capture-Filter ab, und rufen Sie die _ put Enable-Methode auf, um die Eingabe anzugeben. Eine Einschränkung dieser Methode besteht jedoch darin, dass verschiedene Hardwaregeräte unterschiedliche Zeichenfolgen verwenden können, um ihre Eingaben zu identifizieren. Beispielsweise kann eine Karte "Mikrofon" verwenden, um die Mikrofoneingabe zu identifizieren, und eine andere Karte kann "Mikrofon" verwenden. Um den Zeichenfolgenbezeichner für eine bestimmte Eingabe zu bestimmen, verwenden Sie die Windows Multimediafunktionen waveOutOpen, mixerOpenund mixerGetLineInfo. Weitere Informationen finden Sie im MSDN-Thema Mixer Geräteabfragen.
Hinzufügen des Multiplexers und des Dateiwriters
Ein Audioaufnahmegraph muss einen Multiplexer und einen Dateiwriter enthalten.
Ein Multiplexer ist ein Filter, der einen oder mehrere Datenströme in einem einzelnen Stream mit einem bestimmten Format kombiniert. Beispielsweise kombiniert der AVI Mux-Filter Audio- und Videostreams in einem verschachtelten AVI-Stream. Für die Audioaufnahme gibt es in der Regel nur einen einzelnen Audiodatenstrom, aber die Audiodaten müssen weiterhin in einem Format gepackt werden, das auf dem Datenträger gespeichert werden kann, was einen Multiplexer erfordert. Die Wahl des Multiplexers hängt vom Zielformat ab:
- AVI: AVI Multiplexer
- WAV: WavDest
- WMA: ASF Writer
Ein Dateiwriter ist ein Filter, der eingehende Daten in eine Datei schreibt. Verwenden Sie für AVI- oder WAV-Dateien den Dateiwriterfilter. Für WMA-Dateien fungiert der ASF Writer sowohl als Multiplexer als auch als Dateiwriter.
Nachdem Sie die Filter erstellt und dem Diagramm hinzugefügt haben, verbinden Sie den Ausgabepin des Audioaufnahmefilters mit dem Eingabepin des Multiplexers, und verbinden Sie den Ausgabepin des Multiplexers mit dem Eingabepin des Filterwriters (vorausgesetzt, es handelt sich dabei um separate Filter). Um den Dateinamen anzugeben, fragen Sie den Dateiwriter nach der IFileSinkFilter-Schnittstelle ab, und rufen Sie die IFileSinkFilter::SetFileName-Methode auf.
Beispielcode
Das folgende Beispiel zeigt, wie Sie mithilfe des WavDest-Filters ein Audioaufnahmediagramm erstellen. Die gleichen Prinzipien gelten für die anderen Dateitypen.
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.
In diesem Beispiel werden die AddFilterByCLSID unter Hinzufügen eines Filters nach CLSIDbeschriebene Funktion und die ConnectFilters in Verbinden Zwei Filterbeschriebene Funktion verwendet. Keine dieser ApIs ist eine DirectShow-API.