一.在程序中直接
播放声音
文件\x0d\x0a在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的
函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound )或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound )其中参数lpszSound是需要播放声音的.W***文件的路径和文件名, hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC++中的帮助。 例如播放C:soundmusic.wav可以用sndPlaySound ("c:\sound\music.wav",SND_ASYNC)或PlaySound("c:\sound\music.wav",NULL, SND_ASYNC|SND_NODEFAULT )如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。\x0d\x0a\x0d\x0a二.将声音文件加入到程序中\x0d\x0a在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.W***文件的声音播放。要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件。\x0d\x0a具体步骤入下:\x0d\x0a1.获得包含资源的模块句柄:\x0d\x0aHMODULE hmod=AfxGetResourceHandle()\x0d\x0a2.检索资源块信息:\x0d\x0aHRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_W***E1),_T("W***E"))\x0d\x0a3. 装载资源数据并加锁:\x0d\x0aHGLOBAL hGlobalMem=LoadResource(hmod,hSndResource)\x0d\x0aLPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem)\x0d\x0a4.播放声音文件:\x0d\x0asndPlaySound(lpMemSound,SND_MEMORY));\x0d\x0a5.释放资源句柄:\x0d\x0aFreeResource(hGlobalMem)源程序清单如下: LPSTR szFileName//声音文件名 MMCKINFO mmckinfoParentMMCKINFO mmckinfoSubChunkDWORD dwFmtSizeHMMIO m_hmmio//音频文件句柄 DWORD m_WaveLongHPSTR lpData//音频数据 HANDLE m_hDataHANDLE m_hFormatWAVEFORMATEX * lpFormatDWORD m_dwDataOffsetDWORD m_dwDataSizeWAVEHDR pWaveOutHdrWAVEOUTCAPS pwocHWAVEOUT hWaveOut//打开波形文件 if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF))) { //File open Error Error("Failed to open the file.")//错误处理函数 return false} //检查打开文件是否是声音文件 mmckinfoParent.fccType =mmioFOURCC('W','A','V','E')if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF)) { //NOT WAVE FILE AND QUIT } //寻找 'fmt' 块 mmckinfoSubChunk.ckid =mmioFOURCC('f','m','t',' ')if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)) { //Can't find 'fmt' chunk } //获得 'fmt '块的大小,申请内存 dwFmtSize=mmckinfoSubChunk.cksize m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize))if(!m_hFormat) { //failed alloc memory } lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat)if(!lpFormat) { //failed to lock the memory } if((unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize) { //failed to read format chunk } //离开 fmt 块 mmioAscend(m_hmmio,&mmckinfoSubChunk,0)//寻找 'data' 块 mmckinfoSubChunk.ckid=mmioFOURCC('d','a','t','a')if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)) { //Can't find 'data' chunk } //获得 'data'块的大小 m_dwDataSize=mmckinfoSubChunk.cksize m_dwDataOffset =mmckinfoSubChunk.dwDataOffset if(m_dwDataSize==0L) { //no data in the 'data' chunk } //为音频数据分配内存 lpData=new char[m_dwDataSize]if(!lpData) { //faile } if(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)<0) { //Failed to read the data chunk } m_WaveLong=mmioRead(m_hmmio,lpData,SoundLong)if(m_WaveLong<0) { //Failed to read the data chunk } //检查音频设备,返回音频输出设备的性能 if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0) { //Unable to allocate or lock memory } //检查音频输出设备是否能播放指定的音频文件 if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0) { //Failed to OPEN the wave out devices } //准备待播放的数据 pWaveOutHdr.lpData =(HPSTR)lpDatapWaveOutHdr.dwBufferLength =m_WaveLongpWaveOutHdr.dwFlags =0if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0) { //Failed to prepare the wave data buffer } //播放音频数据文件 if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0) { //Failed to write the wave data buffer } //关闭音频输出设备,释放内存 waveOutReset(hWaveOut)waveOutClose(hWaveOut)LocalUnlock(m_hFormat)LocalFree(m_hFormat)delete [] lpData
代码如下:
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
/*播放音乐*/
void playMusic()
{
//aiyo.wav是放在代码文件中
PlaySound(TEXT("aiyo.wav"),0,SND_FILENAME | SND_ASYNC)
}
/**
* 主 函 数(音乐放第一排)
*/
void main()
{
playMusic()
title() //欢迎界面上的标题
flower() //打印字符画
welcome() //欢迎界面上的选项菜单
}
扩展资料
C语言解析WAV音频文件:
C语言基本的二进制文件 *** 作函数有fopen,fread等等。(注意是二进制文件 *** 作函数,所以我们不讨论fgets,这是普通的文本文件 *** 作函数)
fread是一个函数。从一个文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回 0。
它的函数原型为
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream)
而且C语言还有一种类型叫做结构体,它在内存中是顺序存储的。刚好我们也已经得知了WAV文件在文件中的顺序以及该顺序中每个部分对应的含义。
那么我们可以事先根据前面所说的WAV文件结构来定义好一个struct,然后在main主函数中初始化这个struct,并且通过fread的第一个参数带入初始化好的这个struct,那么执行之后就会自动读取该文件,并且按照顺序自动把这些元数据填充进了我们初始化好的struct中。
评论列表(0条)