Erstellen eines Audioaufnahmediagramms
[Bei dem dieser Seite zugeordneten Feature DirectShow handelt es sich um ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine sowie der Audio- und Videoaufnahme in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt für neuen Code nach Möglichkeit dringend die Verwendung von MediaPlayer, IMFMediaEngine sowie der Audio- und Videoaufnahme in Media Foundation anstelle von DirectShow. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, wenn möglich umgeschrieben wird, um die neuen APIs zu verwenden.]
Der erste Schritt für eine Audioaufnahmeanwendung besteht darin, ein Filterdiagramm zu erstellen. Die Konfiguration des Diagramms hängt vom Typ der Datei ab, die Sie erstellen möchten.
- Nur-Audio-AVI-Datei: Audioaufnahmefilter zu AVI Mux-Filter und AVI Mux zu File Writer-Filter.
- WAV-Datei: Audioaufnahmefilter zu WavDest Filter Sample zu File Writer-Filter
- Windows Media Audio(.wma)-Datei: Audioaufnahmefilter zu 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 Media in DirectShow.
Sie können das Filterdiagramm mithilfe des Capture Graph Builder-Objekts erstellen, oder Sie können das Diagramm „manuell” erstellen, d. h., die Anwendung muss jeden Filter programmgesteuert hinzufügen und verbinden. In diesem Artikel wird der manuelle Ansatz beschrieben. Weitere Informationen zur Verwendung des Aufnahmediagramm-Generators finden Sie unter Videoaufnahme. Viele der Informationen in diesem Artikel gelten für nur Audiodiagramme.
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” aufzulisten, 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 zum Filterdiagramm hinzu. Das bevorzugte Audioaufzeichnungsgerät des Benutzers wird zuerst in der Moniker-Liste 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.
Um anzugeben, von welcher Eingabe erfasst werden soll, rufen Sie die IAMAudioInputMixer-Schnittstelle aus dem Audioaufnahmefilter ab, und rufen Sie die put_Enable-Methode auf, um die Eingabe anzugeben. Eine Einschränkung dieser Methode besteht jedoch darin, dass unterschiedliche 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 „Mic” verwenden. Um einen bestimmten String-Identifikator für eine bestimmte Eingabe zu ermitteln, verwenden Sie die Windows Multimedia-Funktionen waveOutOpen, mixerOpen und mixerGetLineInfo. Weitere Informationen finden Sie unter Abfragen von Mischgeräten.
Hinzufügen des Multiplexers und des Datei-Writers
Ein Audioaufnahmediagramm muss einen Multiplexer und einen Dateischreiber enthalten.
Ein Multiplexer ist ein Filter, der einen oder mehrere Datenströme in einem einzelnen Datenstrom mit einem bestimmten Format kombiniert. Der AVI-Mux-Filter kombiniert zum Beispiel Audio- und Videostreams zu einem verschachtelten AVI-Stream. Bei der Audioaufnahme gibt es in der Regel nur einen einzelnen Audiodatenstrom, aber die Audiodaten müssen weiterhin in ein Format verpackt werden, das auf einem Datenträger gespeichert werden kann, was ein Multiplexer erfordert. Die Wahl des Multiplexers hängt vom Zielformat ab:
- AVI: AVI-Multiplexer
- WAV: WavDest
- WMA: ASF Writer
Ein Datei-Writer ist ein Filter, der eingehende Daten in eine Datei schreibt. Verwenden Sie für AVI- oder WAV-Dateien den Dateischreiberfilter. Bei WMA-Dateien fungiert der ASF Writer sowohl als Multiplexer als auch als Dateischreiber.
Nachdem Sie die Filter erstellt und dem Diagramm hinzugefügt haben, verbinden Sie den Ausgabe-Pin des Audioaufnahmefilters mit dem Eingabenadel des Multiplexers, und verbinden Sie den Ausgabenadel des Multiplexers mit dem Eingabenadel des Filterschreibers (vorausgesetzt, dies sind separate Filter). Um den Dateinamen anzugeben, fragen Sie den Dateischreiber für die IFileSinkFilter-Schnittstelle ab, und rufen Sie die IFileSinkFilter::SetFileName-Methode auf.
Beispielcode
Das folgende Beispiel zeigt, wie Sie ein Audioaufnahmediagramm mit dem WavDest-Filter 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 wird die AddFilterByCLSID
in Filter nach CLSID hinzufügen beschriebene Funktion und die ConnectFilters
in Zwei Filter verbinden beschriebene Funktion verwendet Keine dieser APIs ist eine DirectShow-API.
Zugehörige Themen