Condividi tramite


Creazione di un grafico di acquisizione audio

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation, invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Il primo passaggio per un'applicazione di acquisizione audio consiste nel creare un grafico di filtro. La configurazione del grafico dipende dal tipo di file che si vuole creare.

Il filtro WavDest viene fornito come esempio sdk. Per usarlo, è necessario compilare e registrare il filtro.

Per usare il filtro WRITER ASF, è necessario installare Windows Media SDK e ottenere una chiave software per sbloccare il filtro. Per altre informazioni, vedere Uso di Windows Media in DirectShow.

È possibile compilare il grafico del filtro usando l'oggetto Capture Graph Builder oppure compilare il grafico "manualmente", ovvero aggiungere e connettere ogni filtro a livello di codice all'applicazione. Questo articolo descrive l'approccio manuale. Per altre informazioni sull'uso di Capture Graph Builder, vedere Acquisizione video. Gran parte delle informazioni contenute in questo articolo si applica ai grafici solo audio.

Aggiunta del dispositivo di acquisizione audio

Poiché il filtro di acquisizione audio comunica con un dispositivo hardware specifico, non è sufficiente chiamare CoCreateInstance per creare il filtro. Usare invece System Device Enumerator per enumerare tutti i dispositivi nella categoria "Origini acquisizione audio", identificata dall'identificatore di classe CLSID_AudioInputDeviceCategory.

L'enumeratore di dispositivi di sistema restituisce un elenco di moniker per i dispositivi; il nome descrittivo di ogni moniker corrisponde al nome del dispositivo. Scegliere uno dei moniker restituiti e usarlo per creare un'istanza del filtro di acquisizione audio per il dispositivo. Aggiungere il filtro al grafico del filtro. Il dispositivo di registrazione audio preferito dell'utente viene visualizzato per primo nell'elenco dei moniker. L'utente seleziona un dispositivo preferito facendo clic su Suoni e multimediali in Pannello di controllo.

Per altre informazioni, vedere Uso dell'enumeratore di dispositivi di sistema.

Per specificare l'input da cui acquisire, ottenere l'interfaccia IAMAudioInputMixer dal filtro Acquisizione audio e chiamare il metodo put_Enable per specificare l'input. Una limitazione di questo metodo, tuttavia, è che diversi dispositivi hardware possono usare stringhe diverse per identificare i relativi input. Ad esempio, una scheda può usare "Microfono" per identificare l'input del microfono e un'altra scheda può usare "Mic". Per determinare l'identificatore di stringa per un determinato input, utilizzare le funzioni di Windows Multimedia waveOutOpen, mixerOpen e mixerGetLineInfo. Per altre informazioni, vedere Query sui dispositivi mixer.

Aggiunta del multiplexer e del writer di file

Un grafico di acquisizione audio deve contenere un multiplexer e un writer di file.

Un multiplexer è un filtro che combina uno o più flussi in un singolo flusso con un formato specifico. Ad esempio, il filtro AVI Mux combina flussi audio e video in un flusso AVI interleaved. Per l'acquisizione audio, in genere è presente un solo flusso audio, ma i dati audio devono comunque essere inseriti in un formato che può essere salvato su disco, che richiede un multiplexer. La scelta di multiplexer dipende dal formato di destinazione:

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

Un writer di file è un filtro che scrive i dati in ingresso in un file. Per i file AVI o WAV, usare il filtro file writer. Per i file WMA, il writer ASF funge sia da multiplexer che da file writer.

Dopo aver creato i filtri e aggiungerli al grafo, connettere il pin di output del filtro di acquisizione audio al pin di input del multiplexer e connettere il pin di output del multiplexer al pin di input del writer di filtro (presupponendo che questi siano filtri separati). Per specificare il nome del file, eseguire una query sul writer di file per l'interfaccia IFileSinkFilter e chiamare il metodo IFileSinkFilter::SetFileName.

Codice di esempio

L'esempio seguente illustra come creare un grafico di acquisizione audio usando il filtro WavDest. Gli stessi principi si applicano agli altri tipi di file.

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 questo esempio viene usata la AddFilterByCLSID funzione descritta in Aggiungere un filtro per CLSID e la ConnectFilters funzione descritta in Connettere due filtri. Nessuno di questi è un'API DirectShow.

Acquisizione audio