Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo abrir archivos MP3 en lenguaje C (dado el código directamente), qué software de entrada se requiere

Cómo abrir archivos MP3 en lenguaje C (dado el código directamente), qué software de entrada se requiere

Cómo reproducir sonido en VC

2009-09-23 14:58

El sonido es una parte importante de multimedia. Agregar sonido a la aplicación puede hacer que la interfaz sea más amigable. En VC, puede implementar la reproducción de sonido de diferentes maneras según los diferentes requisitos de la aplicación.

I. Un método sencillo para reproducir archivos de sonido

La biblioteca de enlaces dinámicos multimedia en VC proporciona un conjunto de funciones relacionadas con los dispositivos de audio. Usando estas funciones puedes reproducir sonidos fácilmente. La forma más sencilla de reproducir sonido es llamar directamente a la función de reproducción de sonido BOOL sndPlaySound (LPCSTR lpszSound, UINT fuSound) proporcionada por VC o BOOL PlaySound (LPCSTR lpszSound, HMODULE hmod, DWORD fuSound); que necesita reproducir la ruta y el nombre del archivo. El parámetro lpszSound es la ruta y el nombre del archivo .WAV que necesita reproducir sonido, hmod es NULL aquí y fuSound es el indicador para reproducir sonido. Para obtener instrucciones detalladas, consulte la Ayuda de VC. Por ejemplo, para reproducir el archivo C:soundmusic.wav, puede utilizar sndPlaySound ("c:\sound\music.wav", SND_ASYNC); o PlaySound("c:\sound\music.wav", NULL, SND_ASYNC| SND_NODEFAULT). Si no se encuentra el archivo music.wav, el primer formato reproducirá el sonido predeterminado del sistema y el segundo formato no reproducirá el sonido predeterminado del sistema.

II.Agregar archivos de sonido al programa

En la programación VC, puede utilizar varios recursos estándar, como mapas de bits, menús, cuadros de diálogo, etc. Al mismo tiempo, VC también permite a los usuarios personalizar recursos, por lo que podemos agregar archivos de sonido como recursos definidos por el usuario al archivo de recursos del programa, compilarlos y conectarlos para generar archivos EXE y lograr una reproducción de sonido sin archivos .WAV.

Para reproducir un archivo de sonido como recurso, primero debe agregar el archivo de sonido que desea reproducir en el administrador de recursos (el proceso de implementación no es complicado y no se repetirá aquí). Suponiendo que el identificador de recurso del archivo de sonido generado es IDR_WAVE1, solo necesita llamar a la siguiente declaración durante la reproducción:

PlaySound(MAKEINTRESOURCE(IDR_WAVE1), AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_NODEFAULT) SND_NODEFAULT |SND_LOOP);

Entre ellos, la macro MAKEINTRESOURCE() convierte el identificador de recurso entero en una cadena, y la función AfxGetResourceHandle() devuelve el identificador del módulo que contiene el recurso

SND_RESOURCE es un signo obligatorio. Complete el signo.

La segunda forma de reproducir un archivo de sonido como recurso es leer el recurso en la memoria y reproducirlo como datos de la memoria.

Los pasos son los siguientes:

1. Obtenga el identificador del módulo que contiene el recurso:

HMODULE hmod=AfxGetResourceHandle()

2. Lea el bloque de recursos. información:

p>

HRSRC hSndResource=FindResource(hmod, hmod, hmod, hmod, hmod, hmod, hmod, hmod, hmod, hmod, hmod, hmod, hmod

);

2.2. MAKEINTRESOURCE(IDR_WAVE1) ,_T("WAVE"));

3. Cargue datos de recursos y bloquee:

HGLOBAL hGlobalMem=LoadResource(hmod, hSndResource);

LPCTSTR lpMemSound =(LPCSTR)LockResource(hGlobalMem);

4. Reproduzca el archivo de sonido:

sndPlaySound(lpMemSound, SND_MEMORY)); >

5. Libere el identificador del recurso:

FreeResource(hGlobalMem);

III. Métodos avanzados para reproducir archivos de sonido

VC proporciona un conjunto de Métodos que pueden reproducir directamente dispositivos de audio y archivos multimedia. Estas funciones se pueden utilizar para realizar de manera flexible una variedad de procesamientos en archivos de sonido.

Primero, introduciremos algunas estructuras de datos que se utilizarán. La estructura WAVEFORMATEX define el formato de los archivos de datos de audio WAVE. La estructura WAVEHDR define un búfer de audio de forma de onda. La estructura WAVEHDR define un búfer de audio de forma de onda que debe llenarse antes de que los datos leídos se envíen al dispositivo de audio para su reproducción. La estructura WAVEOUTCAPS describe las capacidades del dispositivo de audio. La estructura MMCKINFO contiene información sobre un bloque en un archivo RIFF. Consulte la Ayuda de VC para obtener instrucciones detalladas.

El siguiente es un diagrama de flujo del programa simplificado y una lista de códigos fuente del programa, que se pueden utilizar directamente en el entorno VC:

La lista del programa fuente es la siguiente:

LPSTR szFileName; / /Nombre del archivo de sonido

MMCKINFO mmckinfoParent;

MMCKINFO mmckinfoSubChunk

DWORD dwFmtSize; HMMIO m_hmmio; //identificador del archivo de audio

DWORD m_WaveLong;

HPSTR lpData; //datos de audio

HANDLE m_ hData; HANDLE m_hFormat;

WAVEFORMATEX * lpFormat;

DWORD m_dwDataOffset

DWORD m_dwDataSize

WAVEHDR pWaveOutHdr; >WAVEOUTCAPS pwoc;

HWAVEOUT hWaveOut;

//abrir archivo wave

if(!(m_hmmio=mmioOpen(szFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)) )

{

//Error al abrir el archivo

Error("Error al abrir el archivo.");//Función de manejo de errores

return false;

}

//Compruebe si el archivo abierto es un archivo de sonido

mmckinfoParent.fccType = mmioFOURCC('W', 'A ', 'V', 'E') ;

if( mmioDescend(m_hmmio, (LPMMCKINFO) & mmckinfoParent, NULL, MMIO_FINDRIFF))

{

//NO AGITE EL ARCHIVO Y SALGA

}

}

//Buscando el fragmento "fmt"

mmckinfoSubChunk.ckid =mmioFOURCC ('f','m',' t', ' ');

if(mmioDescend(m_hmmio, amp; mmckinfoSubChunk, amp; mmckinfoParent, MMIO_FINDCHUNK))

{

//No se puede encontrar el fragmento 'fmt'

}

// Obtener el tamaño del fragmento "fmt" y solicitar memoria

dwFmtSize=mmckinfoSubChunk.cksize;

m_hFormat=LocalAlloc(LMEM_MOVEABLE, LOWORD(dwFmtSize));

if(!m_hFormat)

{

//Error al asignar memoria

p>

}

lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);

if(!lpFormat)

{

<

p>// Error al bloquear la memoria

}

if((unsigned long)mmioRead(m_hmmio, (HPSTR)lpFormat, dwFmtSize)!=dwFmtSize)

{

//Error al leer el fragmento de formato

}

//dejar el fragmento fmt

mmioAscend(m_hmmio, amp; mmckinfoSubChunk , 0);

Error al leer el formato chunk.ckid=mmioFOURCC('d','a','t','a');

if(mmioDescend(m_hmmio). , amp; mmckinfoSubChunk, amp. mmckinfoParent, MMIO_FINDCHUNK))

{

//No se puede encontrar el fragmento de 'datos'

}

//Obtener el tamaño del bloque de "datos"

m_dwDataSize= mmckinfoSubChunk.cksize;

m_dwDataOffset = mmckinfoSubChunk.dwDataOffset

if(m_dwDataSize= =0L)

{

// No hay datos en el bloque "datos"

}

// Asigna memoria para datos de audio

lpData=new char[m_dwDataSize]

if(!lpData)

{

// falló

}

if(mmioSeek(m_hmmio, SoundOffset, SEEK_SET)lt; 0)

{

/ Error al leer el bloque de datos

}

m_WaveLong=mmioRead(m_ hmmio, lpData, SoundLong

if(m_WaveLonglt; 0)

{

<); p>/Error al leer el fragmento de datos

}

// Verifique el dispositivo de audio y devuelva el rendimiento del dispositivo de salida de audio

if(waveOutGetDeVCaps( WAVE_MAPPER, amp; pwoc, sizeof(WAVEOUTCAPS )) =0)

{

// No se puede asignar ni bloquear memoria

}

// Compruebe si en el dispositivo de salida de audio se puede reproducir el archivo de audio especificado

if(waveOutOpen(amp; hWaveOut, DevsNum, lpFormat, NULL, NULL, CALLBACK_NULL)! =0)

{

//Error al ABRIR los dispositivos de salida

}

//Preparar los datos para reproducir

pWaveOutHdr.lpData = (HPSTR)lpData

pWave

OutHdr.dwBufferLength = m_WaveLong

pWaveOutHdr.dwFlags = 0;

if(waveOutPrepareHeader(hWaveOut, amp; pWaveOutHdr, sizeof( WAVEHDR))! =0)

{

/Error prepare el búfer de datos de onda

}

//Reproduzca el archivo de datos de audio

if(waveOutWrite(hWaveOut, amp; pWaveOutHdr, sizeof(WAVEHDR)))! sizeof(WAVEHDR))! =0)

{

/Error al escribir el búfer de datos de onda

}

//Cerrar el dispositivo de salida de audio para liberar memoria

waveOutReset(hWaveOut);

waveOutClose( hWaveOut

LocalUnlock(m_hFormat); >LocalFree(m_hFormat);

delete [] lpData;

Nota: 1) La declaración de las funciones de operación del archivo de sonido y del dispositivo de audio anteriores se incluye en el archivo de encabezado mmsystem.h. . h, por lo que la declaración #include "mmsystem.h" debe agregarse al archivo de encabezado del programa. Al mismo tiempo, la biblioteca de importación de enlaces dinámicos winmm.lib debe agregarse durante la compilación. El método de implementación específico es seleccionar Configuración en el menú Proyecto de Developer Studio y luego agregar winmm.lib en el control Módulos de objeto/biblioteca. la pestaña Enlace. 2) Especifique datos diferentes en pWaveOutHdr.lpData para reproducir el sonido del archivo de datos de audio en cualquier ubicación especificada. 3) Los programas anteriores se han depurado en VC 6.0. El manejo de errores y excepciones omitido en el artículo debe agregarse en las aplicaciones reales.

IV. Conclusión

En VC, puedes utilizar diferentes métodos para reproducir archivos de sonido según las necesidades de la aplicación. Las aplicaciones simples pueden llamar directamente a la función de reproducción de sonido. El segundo método agrega el sonido como recurso al archivo ejecutable. Si desea procesar los datos de sonido antes de reproducirlos, puede utilizar el tercer método.

Bibliografía:

1. Paul Perry, Chen Xiangqun y otros tradujeron la "Guía de desarrollo multimedia" estadounidense Tsinghua University Press

2. Rob McGregor y otros, traducido por Sun Fengying y otros de Estados Unidos, "MFC Develops Windows 95/NT4 Applications" Tsinghua University Press, 1998

3. Zhou Jingli "Multimedia Sound Card Technology". y Aplicación" Sociedad Editorial de la Industria Electrónica 1998