国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
VC++中播放聲音的方法
內(nèi)容提要
      本文討論了在VC++中播放聲音文件的幾種不同方法,并提供了具體的實(shí)現(xiàn)例句?! ?
關(guān)鍵詞
       聲音文件 音頻設(shè)備 播放 多媒體
文章正文
   聲音是多媒體的一個(gè)重要組成部分,在應(yīng)用程序中加入聲音可以使界面更友好。在VC++中可以根據(jù)不同的應(yīng)用要求,用不同的方法實(shí)現(xiàn)聲音的播放。

一.播放聲音文件的簡(jiǎn)單方法
  在VC++ 中的多媒體動(dòng)態(tài)連接庫(kù)中提供了一組與音頻設(shè)備有關(guān)的函數(shù)。利用這些函數(shù)可以方便地播放聲音。最簡(jiǎn)單的播放聲音方法就是直接調(diào)用VC++中提供的聲音播放函數(shù)BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中參數(shù)lpszSound是需要播放聲音的.WAV文件的路徑和文件名, hmod在這里為NULL,fuSound是播放聲音的標(biāo)志,詳細(xì)說(shuō)明請(qǐng)參考VC++中的幫助。 例如播放C:\sound\music.wav可以用sndPlaySound ("c:\\sound\\music.wav",SND_ASYNC);或PlaySound("c:\\sound\\music.wav",NULL, SND_ASYNC|SND_NODEFAULT );如果沒(méi)有找到music.wav文件,第一種格式將播放系統(tǒng)默認(rèn)的聲音,第二種格式不會(huì)播放系統(tǒng)默認(rèn)的聲音。

二.將聲音文件加入到程序中
  在VC++的程序設(shè)計(jì)中,可以利用各種標(biāo)準(zhǔn)的資源,如位圖,菜單,對(duì)話框等。同時(shí)VC++也允許用戶自定義資源,因此我們可以將聲音文件作為用戶自定義資源加入程序資源文件中,經(jīng)過(guò)編譯連接生成EXE文件,實(shí)現(xiàn)無(wú).WAV文件的聲音播放。
  要實(shí)現(xiàn)作為資源的聲音文件的播放,首先要在資源管理器中加入待播放的聲音文件(實(shí)現(xiàn)過(guò)程并不復(fù)雜,這里不在敘述)。假設(shè)生成的聲音文件資源標(biāo)識(shí)符為IDR_WAVE1。在播放時(shí)只需要調(diào)用下面的語(yǔ)句:
  PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),   SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
  其中MAKEINTRESOURCE()宏將整數(shù)資源標(biāo)識(shí)符轉(zhuǎn)變?yōu)樽址?,AfxGetResourceHandle()函數(shù)返回包含資源的模塊句柄,
SND_RESOURCE是必須的標(biāo)志。
  作為資源的聲音文件的第二種播放方法是把資源讀入內(nèi)存后作為內(nèi)存數(shù)據(jù)播放。具體步驟入下:
  1.獲得包含資源的模塊句柄:
  HMODULE hmod=AfxGetResourceHandle();
  2.檢索資源塊信息:
  HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
  3. 裝載資源數(shù)據(jù)并加鎖:
  HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);
  4.播放聲音文件:
  sndPlaySound(lpMemSound,SND_MEMORY));
  5.釋放資源句柄:
  FreeResource(hGlobalMem);

三.播放聲音文件的高級(jí)方法
  在VC++中提供了一組對(duì)音頻設(shè)備及多媒體文件直接進(jìn)行操作的函數(shù)。利用這些函數(shù)可以靈活地對(duì)聲音文件進(jìn)行各種處理。
  首先介紹幾個(gè)要用到的數(shù)據(jù)結(jié)構(gòu)。WAVEFORMATEX結(jié)構(gòu)定義了WAVE音頻數(shù)據(jù)文件的格式。WAVEHDR結(jié)構(gòu)定義了波形音頻緩沖區(qū)。讀出的數(shù)據(jù)首先要填充此緩沖區(qū)才能送音頻設(shè)備播放。WAVEOUTCAPS結(jié)構(gòu)描述了音頻設(shè)備的性能。MMCKINFO結(jié)構(gòu)包含了RIFF文件中一個(gè)塊的信息。詳細(xì)的說(shuō)明請(qǐng)參考VC++中的幫助。
  下面給出程序流程簡(jiǎn)圖及程序源代碼清單,在VC++環(huán)境下可直接使用:


源程序清單如下:
LPSTR szFileName;//聲音文件名
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubChunk;
DWORD dwFmtSize;
HMMIO m_hmmio;//音頻文件句柄
DWORD m_WaveLong;
HPSTR lpData;//音頻數(shù)據(jù)
HANDLE m_hData;
HANDLE m_hFormat;
WAVEFORMATEX * lpFormat;
DWORD m_dwDataOffset;
DWORD m_dwDataSize;
WAVEHDR pWaveOutHdr;
WAVEOUTCAPS pwoc;
HWAVEOUT hWaveOut;
//打開(kāi)波形文件
if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)))
{
//File open Error
Error("Failed to open the file.");//錯(cuò)誤處理函數(shù)
return false;
}
//檢查打開(kāi)文件是否是聲音文件
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 '塊的大小,申請(qǐng)內(nèi)存
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
}
//離開(kāi) 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
}
//為音頻數(shù)據(jù)分配內(nèi)存
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
}
//檢查音頻設(shè)備,返回音頻輸出設(shè)備的性能
if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0)
{
//Unable to allocate or lock memory
}
//檢查音頻輸出設(shè)備是否能播放指定的音頻文件
if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)
{
//Failed to OPEN the wave out devices
}
//準(zhǔn)備待播放的數(shù)據(jù)
pWaveOutHdr.lpData =(HPSTR)lpData;
pWaveOutHdr.dwBufferLength =m_WaveLong;
pWaveOutHdr.dwFlags =0;
if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to prepare the wave data buffer
}
//播放音頻數(shù)據(jù)文件
if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to write the wave data buffer
}
//關(guān)閉音頻輸出設(shè)備,釋放內(nèi)存
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
LocalUnlock(m_hFormat);
LocalFree(m_hFormat);
delete [] lpData;
說(shuō)明:1)以上使用的音頻設(shè)備和聲音文件操作函數(shù)的聲明包含在mmsystem.h頭文件中,因此在程序中必須用#include "mmsystem.h"語(yǔ)句加入頭文件。同時(shí)在編譯時(shí)要加入動(dòng)態(tài)連接導(dǎo)入庫(kù)winmm.lib,具體實(shí)現(xiàn)方法是從Developer Studio的Project菜單中選擇Settings,然后在Link選項(xiàng)卡上的Object/Library Modules控制中加入winmm.lib。2)在pWaveOutHdr.lpData中指定不同的數(shù)據(jù),可以播放音頻數(shù)據(jù)文件中任意指定位置的聲音。3) 以上程序均在VC++6.0中調(diào)試通過(guò),在文中省略了對(duì)錯(cuò)誤及異常情況的處理,在實(shí)際應(yīng)用中必須加入。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
waveOutPause 收藏
VC 播放wav文件示例
【wav音頻解析】之wavread函數(shù)的C 實(shí)現(xiàn)
PCM編碼與Waveform音頻文件(.wav)格式詳解
003、利用 pyaudio 和 wave 進(jìn)行錄音
C#Winform做一個(gè)簡(jiǎn)單的呼叫中心的心得
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服