Partilhar via


Criar um gráfico de captura de áudio

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído pelo MediaPlayer, IMFMediaEngine e Captura de áudio/vídeo no Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o MediaPlayer, o IMFMediaEngine e a Captura de áudio/vídeo no Media Foundation em vez do DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

A primeira etapa de um aplicativo de captura de áudio é criar um gráfico de filtros. A configuração do gráfico depende do tipo de arquivo que você deseja criar.

O filtro WavDest é fornecido como um exemplo de SDK. Para usá-lo, você deve criar e registrar o filtro.

Para usar o filtro Gravador ASF, você deve instalar o SDK do Windows Media e obter uma chave de software para desbloquear o filtro. Para obter mais informações, consulte Usar o Windows Media no DirectShow.

Você pode criar o gráfico de filtro usando o objeto Capture Graph Builder ou pode criar o gráfico manualmente, ou seja, fazer com que o aplicativo adicione e conecte de forma programada cada filtro. Este artigo descreve a abordagem manual. Para obter mais informações sobre como usar o Capture Graph Builder, consulte Captura de vídeo. Muitas das informações nesse artigo se aplicam apenas para gráficos de áudio.

Adicionar o dispositivo de captura de áudio

Como o filtro de captura de áudio se comunica com um dispositivo de hardware específico, você não pode simplesmente chamar CoCreateInstance para criar o filtro. Em vez disso, use o Enumerador de dispositivos do sistema para enumerar todos os dispositivos na categoria fontes de captura de áudio, que é identificada pelo identificador de classe CLSID_AudioInputDeviceCategory.

O enumerador de dispositivos do sistema retorna para uma lista de monikers para os dispositivos e o nome de fácil utilização de cada moniker corresponde ao nome do dispositivo. Escolha um dos monikers retornados e use-o para criar uma instância do filtro Captura de áudio para esse dispositivo. Adicione o filtro ao gráfico de filtro. O dispositivo de gravação de áudio preferido do usuário aparece primeiro na lista de moniker. (O usuário seleciona um dispositivo preferido clicando em Sons e Multimídia no Painel de Controle.)

Para obter mais informações, consulte Usar o enumerador de dispositivo do sistema.

Para especificar de qual entrada capturar, obtenha a interface IAMAudioInputMixer do filtro Captura de áudio e chame o método put_Enable para especificar a entrada. No entanto, uma limitação desse método é que diferentes dispositivos de hardware podem usar diferentes cadeias de caracteres para identificar suas entradas. Por exemplo, uma placa pode usar "Microphone" para identificar a entrada do microfone e outra placa pode usar "Mic". Para determinar o identificador de cadeia de caracteres para uma determinada entrada, use as funções de Multimídia do Windows waveOutOpen, mixerOpen e mixerGetLineInfo. Consulte Consultas de dispositivo do mixer para obter mais informações.

Adicionar Multiplexador e Gravador de arquivos

Um gráfico de captura de áudio deve conter um multiplexador e um gravador de arquivos.

Um multiplexador é um filtro que combina uma ou mais transmissões em uma única transmissão com um formato específico. Por exemplo, o filtro AVI Mux combina transmissões de áudio e vídeo em uma transmissão AVI intercalado. Para captura de áudio, geralmente há apenas uma transmissão de áudio, mas os dados de áudio ainda devem ser empacotados em um formato que possa ser salvo em disco, o que requer um multiplexador. A escolha do multiplexador depende do formato de destino:

  • AVI: Multiplexador AVI
  • WAV: WavDest
  • WMA: gravador ASF

Um gravador de arquivos é um filtro que grava dados de entrada em um arquivo. Para arquivos AVI ou WAV, use o filtro Gravador de arquivo. Para arquivos WMA, o gravador ASF atua como multiplexador e gravador de arquivos.

Depois de criar os filtros e adicioná-los ao gráfico, conecte o pino de saída do filtro de captura de áudio ao pino de entrada do multiplexador e conecte o pino de saída do multiplexador ao pino de entrada do gravador de filtro (supondo que sejam filtros separados). Para especificar o nome do arquivo, consulte o gravador de arquivos para a interface IFileSinkFilter e chame o método IFileSinkFilter::SetFileName.

Código de exemplo

O exemplo a seguir mostra como criar um gráfico de captura de áudio usando o filtro WavDest. Os mesmos princípios se aplicam aos outros tipos de arquivo.

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.

Este exemplo usa a função AddFilterByCLSID descrita em Adicionar um filtro por CLSID e a função ConnectFilters descrita em Conectar dois filtros. Nenhuma delas é uma API do DirectShow.

Captura de áudio