Skapa en ljudinspelningsgraf
[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]
Det första steget för ett ljudinspelningsprogram är att skapa ett filterdiagram. Konfigurationen av diagrammet beror på vilken typ av fil du vill skapa.
- AVI-fil med enbart ljud: Ljudinspelningsfilter till AVI Mux- filter och AVI Mux till Filskrivare- filter.
- WAV-fil: Ljudinsamlingsfilter för att WavDest-filterexempel till filskrivarefilter
- Windows Media Audio-fil (.wma): Filter för ljudupptagning till WM ASF Writer.
WavDest-filtret tillhandahålls som ett SDK-exempel. Om du vill använda det måste du skapa och registrera filtret.
Om du vill använda ASF Writer-filtret måste du installera Windows Media SDK och hämta en programvarunyckel för att låsa upp filtret. Mer information finns i Använda Windows Media i DirectShow.
Du kan skapa filterdiagrammet med hjälp av objektet Capture Graph Builder eller skapa grafen "manuellt". Det vill: låt programmet programmatiskt lägga till och ansluta varje filter. Den här artikeln beskriver den manuella metoden. Mer information om hur du använder Capture Graph Builder finns i Video Capture. Mycket av informationen i den artikeln gäller endast för diagram med endast ljud.
Lägga till ljudinspelningsenheten
Eftersom ljudinspelningsfiltret kommunicerar med en specifik maskinvaruenhet kan du inte bara anropa CoCreateInstance för att skapa filtret. Använd i stället System Device Enumerator för att räkna upp alla enheter i kategorin "Ljudinspelningskällor", som identifieras av klassidentifieraren CLSID_AudioInputDeviceCategory.
System Device Enumerator returnerar en lista över monikers för enheterna. Varje monikers vänliga namn motsvarar enhetens namn. Välj en av de returnerade monikers och använd den för att skapa en instans av ljudinspelningsfiltret för den enheten. Lägg till filtret i filterdiagrammet. Användarens föredragna ljudinspelningsenhet visas först i monikerlistan. (Användaren väljer en önskad enhet genom att klicka på Ljud och multimedia i Kontrollpanelen.)
Mer information finns i Using the System Device Enumerator.
Om du vill ange vilka indata som ska hämtas från hämtar du IAMAudioInputMixer--gränssnittet från filtret Ljudinspelning och anropar metoden put_Enable för att ange indata. En begränsning för den här metoden är dock att olika maskinvaruenheter kan använda olika strängar för att identifiera sina indata. Ett kort kan till exempel använda "Mikrofon" för att identifiera mikrofonens indata och ett annat kort kan använda "Mic". Om du vill fastställa strängidentifieraren för en viss indata använder du Windows Multimedia-funktionerna waveOutOpen, mixerOpenoch mixerGetLineInfo. Mer information finns i mixerenhetsfrågor.
Lägga till Multiplexer och filskrivaren
Ett ljuddiagram för ljudinspelning måste innehålla en multiplexer och en filskapare.
En multiplexer är ett filter som kombinerar en eller flera strömmar till en enda ström med ett visst format. Till exempel kombinerar AVI Mux-filtret ljud- och videoströmmar till en interfolierad AVI-ström. För ljudinspelning finns det vanligtvis bara en enda ljudström, men ljuddata måste fortfarande paketeras i ett format som kan sparas på disken, vilket kräver en multiplexer. Valet av multiplexer beror på målformatet:
- AVI: AVI Multiplexer
- WAV: WavDest
- WMA: ASF-skrivare
En filskrivare är ett filter som skriver inkommande data till en fil. För AVI- eller WAV-filer använder du Filskrivningsfilter. För WMA-filer fungerar ASF Writer som både multiplexer och filskrivare.
När du har skapat filtren och lagt till dem i grafen ansluter du ljudavbildningsfiltrets utdatastift till multiplexerns indatastift och ansluter multiplexerns utdatastift till filterskrivarens indatastift (förutsatt att dessa är separata filter). Om du vill ange filnamnet frågar du filskrivaren efter IFileSinkFilter-gränssnittet och anropar metoden IFileSinkFilter::SetFileName.
Exempelkod
I följande exempel visas hur du skapar en ljudinspelningsgraf med hjälp av WavDest-filtret. Samma principer gäller för de andra filtyperna.
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.
I det här exemplet används funktionen AddFilterByCLSID
som beskrivs i Lägg till ett filter av CLSIDoch funktionen ConnectFilters
som beskrivs i Anslut två filter. Inget av dessa är ett DirectShow-API.
Relaterade ämnen