Creación de un gráfico de captura de audio
[La característica asociada a esta página, DirectShow es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine, y Captura de audio y vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código useMediaPlayer, IMFMediaEngine y Captura de audio y vídeo en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft recomienda reescribir el código actual que usa las API heredadas para usar las nuevas API si es posible.]
El primer paso para una aplicación de captura de audio es crear un gráfico de filtro. La configuración del gráfico depende del tipo de archivo que desea crear.
- Archivo AVI de solo audio: filtro de captura de audio al filtro Mux AVI y filtro Mux AVI a escritor de archivos.
- Archivo WAV: filtro de captura de audio al filtro WavDest de muestra al filtro de escritura de archivos.
- Archivo de audio de Windows Media (.wma): filtro de captura de audio al filtro de escritura ASF VM.
El filtro WavDest se proporciona como ejemplo del SDK. Para usarlo, debe compilar y registrar el filtro.
Para usar el filtro de escritura ASF, debe instalar el SDK de Windows Media y obtener una clave de software para desbloquear el filtro. Para obtener más información, consulte Uso de Windows Media en DirectShow.
Puede compilar el gráfico de filtros mediante el objeto Generador de gráficos de captura o puede compilar el gráfico "manualmente"; es decir, hacer que la aplicación agregue y conecte cada filtro mediante programación. En este artículo se describe el enfoque manual. Para obtener más información sobre el uso del Generador de gráficos de captura, consulte Captura de vídeo. Gran parte de la información de ese artículo se aplica a gráficos de solo audio.
Adición del dispositivo de captura de audio
Dado que el filtro de captura de audio se comunica con un dispositivo de hardware específico, no puede llamar simplemente a CoCreateInstance para crear el filtro. En su lugar, use el enumerador de dispositivos del sistema para enumerar todos los dispositivos de la categoría "Orígenes de captura de audio", que se identifica mediante el identificador de clase CLSID_AudioInputDeviceCategory.
El enumerador de dispositivos del sistema devuelve una lista de monikers para los dispositivos; el nombre descriptivo de cada moniker corresponde al nombre del dispositivo. Elija uno de los monikers devueltos y úselo para crear una instancia del filtro de captura de audio para ese dispositivo. Agregue el filtro al gráfico de filtros. El dispositivo de grabación de audio preferido del usuario aparece primero en la lista de monikers. (El usuario selecciona un dispositivo preferido haciendo clic en Sonidos y multimedia en Panel de control).
Para obtener más información, consulte Uso del enumerador de dispositivos del sistema.
Para especificar la entrada de la que se va a capturar, obtenga la interfaz IAMAudioInputMixer del filtro de captura de audio y llame al método put_Enable para especificar la entrada. Sin embargo, una limitación de este método es que diferentes dispositivos de hardware pueden usar cadenas diferentes para identificar sus entradas. Por ejemplo, una tarjeta puede usar "Micrófono" para identificar la entrada del micrófono y otra tarjeta puede usar "Mic". Para determinar el identificador de cadena de una entrada determinada, use las funciones de Windows Media waveOutOpen, mixerOpen y mixerGetLineInfo. Consulte Consultas de dispositivos mezcladores para obtener más información.
Adición del multiplexor y del sistema de escritura de archivos
Un gráfico de captura de audio debe contener un multiplexor y un sistema de escritura de archivos.
Un multiplexor es un filtro que combina uno o varios flujos en una sola secuencia con un formato determinado. Por ejemplo, el filtro Mux de AVI combina secuencias de audio y vídeo en una secuencia AVI intercalada. En el caso de la captura de audio normalmente solo hay una sola secuencia de audio, pero los datos de audio deben empaquetarse en un formato que se pueda guardar en el disco, lo que requiere un multiplexor. La elección del multiplexor depende del formato de destino:
- AVI: multiplexor AVI
- WAV: WavDest
- WMA: sistema de escritura ASF
Un sistema de escritura de archivos es un filtro que escribe los datos entrantes en un archivo. En el caso de los archivos AVI o WAV, use el filtro del sistema de escritura de archivos. En el caso de los archivos WMA, el sistema de escritura ASF actúa como multiplexor y escritor de archivos.
Después de crear los filtros y agregarlos al gráfico, conecte el pin de salida del filtro de captura de audio al pin de entrada del multiplexor y conecte el pin de salida del multiplexor al pin de entrada del sistema de escritura de filtros (suponiendo que son filtros independientes). Para especificar el nombre de archivo, consulte el sistema de escritura de archivos para la interfaz IFileSinkFilter y llame al método IFileSinkFilter::SetFileName.
Código de ejemplo
En el ejemplo siguiente se muestra cómo crear un gráfico de captura de audio mediante el filtro WavDest. Los mismos principios se aplican a los otros tipos de archivo.
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.
En este ejemplo se usa la función AddFilterByCLSID
descrita en Adición de un filtro mediante CLSID y la función ConnectFilters
descrita en Conexión de dos filtros. Ninguna de estas es una API de DirectShow.
Temas relacionados