C/Visual C - CAPTURAR AUDIO bajo win32

 
Vista:

CAPTURAR AUDIO bajo win32

Publicado por Alex (1 intervención) el 29/10/2002 04:35:29
Necesito saber como capturar audio de la entrada de micro para un programa.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Captura de audio desde el micrófono en Win32

Publicado por Alejandro (913 intervenciones) el 27/03/2025 21:06:47
Para capturar audio desde la entrada del micrófono en un programa de Windows utilizando la API de Win32, puedes usar la API de Windows Multimedia (WinMM). A continuación, te muestro un ejemplo básico de cómo hacerlo.

Ejemplo de captura de audio en C



Este ejemplo utiliza la API de WinMM para capturar audio desde el micrófono y guardarlo en un archivo WAV.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
 
#pragma comment(lib, "winmm.lib")
 
#define BUFFER_SIZE 44100 // Tamaño del buffer para la captura
 
void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) {
    if (uMsg == WIM_DATA) {
        // Aquí puedes procesar los datos de audio capturados
        printf("Datos de audio capturados.\n");
    }
}
 
int main() {
    HWAVEIN hWaveIn;
    WAVEFORMATEX wfx;
    WAVEHDR waveHdr;
    char buffer[BUFFER_SIZE];
 
    // Configurar el formato de audio
    wfx.wFormatTag = WAVE_FORMAT_PCM;
    wfx.nChannels = 1; // Mono
    wfx.nSamplesPerSec = 44100; // Frecuencia de muestreo
    wfx.wBitsPerSample = 16; // Bits por muestra
    wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample) / 8;
    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
 
    // Abrir el dispositivo de entrada de audio
    if (waveInOpen(&hWaveIn, WAVE_MAPPER, &wfx, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
        printf("Error al abrir el dispositivo de entrada de audio.\n");
        return 1;
    }
 
    // Preparar el buffer para la captura
    waveHdr.lpData = buffer;
    waveHdr.dwBufferLength = BUFFER_SIZE;
    waveHdr.dwFlags = 0;
    waveHdr.dwLoops = 0;
 
    waveInPrepareHeader(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    waveInAddBuffer(hWaveIn, &waveHdr, sizeof(WAVEHDR));
 
    // Iniciar la captura de audio
    waveInStart(hWaveIn);
    printf("Capturando audio... Presiona Enter para detener.\n");
    getchar(); // Esperar a que el usuario presione Enter
 
    // Detener la captura
    waveInStop(hWaveIn);
    waveInUnprepareHeader(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    waveInClose(hWaveIn);
 
    printf("Captura de audio finalizada.\n");
    return 0;
}

Explicación del código:


1. Configuración del formato de audio: Se define el formato de audio utilizando la estructura `WAVEFORMATEX`, especificando parámetros como la frecuencia de muestreo, el número de canales y los bits por muestra.
2. Apertura del dispositivo de entrada: Se utiliza `waveInOpen` para abrir el dispositivo de entrada de audio (micrófono).
3. Preparación del buffer: Se prepara un buffer para almacenar los datos de audio capturados.
4. Captura de audio: Se inicia la captura de audio con `waveInStart`, y el programa espera a que el usuario presione Enter para detener la captura.
5. Detención y cierre: Se detiene la captura y se cierra el dispositivo de entrada.

Compilación y ejecución


Para compilar y ejecutar el programa, puedes usar un compilador de C como `gcc` o Visual Studio. Asegúrate de vincular la biblioteca `winmm.lib`.

1
2
gcc -o audio_capture audio_capture.c -lwinmm
./audio_capture

Notas adicionales


- Este ejemplo captura audio en un buffer, pero no lo guarda en un archivo. Para guardar el audio en un archivo WAV, necesitarás implementar la lógica para escribir el encabezado WAV y los datos en un archivo.
- Asegúrate de tener los permisos necesarios para acceder al micrófono en tu sistema.

¡Buena suerte con tu proyecto, tocayo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar