c語言wav
可以使用PlaySound()函數播放聲音文件,
該函數原型位於#include<mmsystem.h>中,
函數原型為:BOOLPlaySound(LPCSTRpszSound,HMODULEhmod,DWORDfdwSound);
參數pszSound是要播放聲音的文件名,
只支持WAV等格式的文件
參數hmod是應用程序的實例句柄,一般傳遞NULL就可以;
參數fdwSound是標志的組合掩碼,
可選值有SND_FILENAME、SND_ASYNC、SND_SYNC等。
SND_FILENAME表示pszSound參數指定的是文件名(pszSound還可以指定資源、內存音樂、系統音樂等等);
SND_ASYNC:用非同步方式播放聲音,PlaySound函數在開始播放後立即返回;
SND_SYNC:同步播放聲音,在播放完後PlaySound函數才返回;
SND_LOOP一遍遍的重復播放聲音,必須與SND_ASYNC標志一塊使用。
【2、使用舉例】
PlaySound(TEXT("C:\WINDOWS\Media\WindowsXP啟動.wav"),NULL,SND_FILENAME|SND_SYNC);
❷ 如何在c語言程序中添加背景音樂
用PlaySound 函數可以播放 .wav 格式音樂。x0dx0a例如 下面 播放 紫竹調.wav 格式音樂,它存放在 D:\\zzz\\zzd.wav x0dx0a其它音樂格式能不能播放,要試驗一下才知道,也許不行,也許可以。x0dx0a#include
❸ 【求大神指導】wav文件數據區(文件頭後面的)怎麼用c語言編寫啊
wav文件是微軟保存音頻數據的文件,它的數據內容一般都是錄音的數據內容,下面的wav文件介紹供參考:
首先wav文件是基於微軟版本的EA-IFF方法來保存數據的,IFF是Electronic Arts公司開發的一種文件格式(EA IFF 1985),基於基本的IFF格式,wav的收保存在各種不同的「chunk」中。
在wav文件中,有三種chunk是必須的,另外的chunk都是可選的,簡單的可以如圖所示:
1.'RIFF','WAVE' chunk
這個chunk主要是一個標記,告訴我們這是一個wav文件。它的數據信息可以用如下:
----------------------------------
|ID | 4 Bytes | 'RIFF' |
----------------------------------
| Size | 4 Bytes| |
----------------------------------
| Type | 4 Bytes| 'WAVE'|
----------------------------------
所以wav文件的wave chunk是很簡單的,共有12個位元組,size表示的是整個wav文件大小除去該chunk的ID和Size的大小,也就是FileSize-8。
2."fmt" chunk
格式chunk包含個各種描述內容格式的重要參數,比如音頻的采樣率,比特率等。它的信息可以用如下的圖來表示:
--------------------------------------------------------------------
|ID | 4Bytes | 'fmt'|
--------------------------------------------------------------------
|Size | 4Bytes | 數值為16或18,18則最後又附加信息 |
------------------------------------------------------------------------
|FormatTag | 2 Bytes | 編碼方式,一般為0x0001|
--------------------------------------------------------------------|
|Channels | 2 Bytes | 聲道數目,1--單聲道;2--雙聲道 |
--------------------------------------------------------------------|
| SamplesPerSec | 4Bytes | 采樣頻率|
--------------------------------------------------------------------|
| AvgBytesPerSec| 4Bytes | 每秒所需位元組數|
--------------------------------------------------------------------|
|BlockAlign | 2 Bytes | 數據塊對齊單位(每個采樣需要的位元組數) |
--------------------------------------------------------------------|
| BitsPerSample | 2Bytes | 每個采樣需要的bit數|
--------------------------------------------------------------------|
|| 2 Bytes | 附加信息(可選,通過Size來判斷有無) |
-------------------------------------------------------------------- ----
該部分的內容以』fmt』為標記,4位元組size表示的該chunk除去ID和Size的大小,如圖中所示為16或18;FormatTag表示的該wav數據的編碼,這里最常用的編碼就是0x0001,為PCM編碼,其他的編碼,可以參考微軟的Windows wave格式。聲道數,采樣率不再累贅,blockalign以8位元組對齊,可以用下面的方式計算
nBlockAlign = channels * ((nBitsPerSample + 7) / 8);
nBitsPerSample表示音頻數據字長,16位的bit最為常見;AvgBytesPerSe表示每秒鍾的位元組數。
3.'data'chunk
數據chunk則保存了真正的wav數據;它的格式如下:
|ID | 4 Bytes | 'data' |
----------------------------------
| Size | 4 Bytes| |
----------------------------------
| data|| |
----------------------------------
以'data'作為該Chunk的標示。然後是數據的大小。緊接著就是wav數據。根據Format Chunk中的聲道數以及采樣bit數,每個byte中wav數據的bit位置可以分成以下幾種形式(以intel的little edian為例):
a,單聲道8位字長
---------------------------------------------------------------------
| 單聲道 | 取樣1 | 取樣2 | 取樣3 | 取樣4 |
| |--------------------------------------------------------
| 8bit量化 | 聲道0 | 聲道0 | 聲道0 | 聲道0 |
---------------------------------------------------------------------
b, 雙聲道8位字長
|雙聲道 |取樣1|取樣2|
| |--------------------------------------------------------
| 8bit量化 | 聲道0(左) | 聲道1(右) | 聲道0(左) | 聲道1(右) |
---------------------------------------------------------------------
c, 單聲道16位字長
||取樣1|取樣2|
| 單聲道 |--------------------------------------------------------
| 16bit量化 | 聲道0 | 聲道0| 聲道0 | 聲道0 |
| | (低位位元組) | (高位位元組) | (低位位元組) | (高位位元組) |
---------------------------------------------------------------------
c, 雙聲道16位字長
||取樣1|
| 雙聲道 |--------------------------------------------------------
| 16bit量化 | 聲道0(左) | 聲道0(左) | 聲道1(右) | 聲道1(右)|
| | (低位位元組) | (高位位元組) | (低位位元組) | (高位位元組)|
---------------------------------------------------------------------
參考:
http://www.codeguru.com/cpp/g-m/multimedia/audio/article.php/c8935/PCM-Audio-and-Wave-Files.htm#page-1
http://blog.csdn.net/bluesoal/article/details/932395
❹ 在c語言程序中怎樣載入背景音樂啊,是背景音樂哦,求函數具體用法和實例。謝謝
代碼如下:
#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(); //歡迎界面上的選項菜單
}
(4)c語言wav擴展閱讀
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中。
❺ C語言編寫程序將多個wav文件拼接成一個音頻wav文件並播放
#include<stdio.h>
#include<string.h>
#defineRIFF_SIGN_ID0x46464952ul
#defineWAVE_SIGN_ID0x45564157ul
#defineFMT__SIGN_ID0x20746D66ul
#defineFACT_SIGN_ID0x74636166ul
#defineDATA_SIGN_ID0x61746164ul
#ifndefDWORD
typedefunsignedlongDWORD;
#endif
#ifndefWORD
typedefunsignedshortWORD;
#endif
#ifndefBYTE
typedefunsignedcharBYTE;
#endif
structRIFF_HEADER
{
DWORDRiffID;//資源交換文件標志0x46464952'R','I','F','F'
DWORDRiffSize;//從下個地址開始到文件尾的總位元組數
DWORDRiffFormat;//WAV文件標志0x45564157'W','A','V','E'
};
structWAVE_FORMAT
{
WORDFormatTag;//格式種類(值為1時,表示數據為線性PCM編碼)
WORDChannels;//通道數,單聲道為1,雙聲道為2
DWORDSamplesPerSec;//采樣頻率
DWORDAvgBytesPerSec;//每秒所需位元組數
WORDBlockAlign;//數據塊對齊單位(每個采樣需要的位元組數)
WORDBitsPerSample;//每個采樣需要的bit數
WORDotherInfo;//附加信息(可選,通過Size來判斷有無)
};
structFMT_BLOCK
{
DWORDFmtID;//波形格式標志0x20746D66'f','m','t',''
DWORDFmtSize;//波形格式部分長度(一般為00000010H)
WAVE_FORMATwavFormat;//波形數據格式
};
structUNKNOW_BLOCK
{
DWORDID;//未知塊
DWORDSize;//未知塊長度
};
structFACT_BLOCK
{
DWORDFactID;//可選部分標識0x74636166'f','a','c','t'
DWORDFactSize;//可選部分長度
BYTEData[1];//可選部分數據
};
structDATA_BLOCK
{
DWORDDataID;//數據標志符0x61746164,'d','a','t','a'
DWORDDataSize;//DATA總數據長度位元組
BYTEData[1];//數據
};
BYTE*openWaveFile(constchar*name);
BYTE*getWaveData(BYTE*wav,int*dLen);
voidprintWaveFormat(BYTE*wav);
intsaveWaveFile(constchar*name,BYTE*wav);
BYTE*catWave(BYTE*&wav1,BYTE*&wav2);
size_tgetTotalLen(BYTE*wav);
intmain(intargc,char*argv[])
{
intdLen;
BYTE*data1=openWaveFile("1.wav");
printWaveFormat(data1);
BYTE*data2=openWaveFile("2.wav");
printWaveFormat(data2);
data1=catWave(data1,data2);
printWaveFormat(data1);
saveWaveFile("3.wav",data1);
return0;
}
BYTE*openWaveFile(constchar*name)
{
size_treadByte;
FILE*fp=fopen(name,"rb");
if(fp==NULL)returnNULL;
RIFF_HEADERfh;
if(fread(&fh,sizeof(fh),1,fp)!=1)
{
fclose(fp);
printf("RiffHeader文件長度錯誤 ");
returnNULL;
}
if(fh.RiffFormat!=WAVE_SIGN_ID||fh.RiffID!=RIFF_SIGN_ID)
{
fclose(fp);
printf("文件標識符錯誤ID:%08XFormat:%08X ",fh.RiffID,fh.RiffFormat);
returnNULL;
}
BYTE*r=newBYTE[fh.RiffSize+10],*pr;
if(r==NULL)
{
fclose(fp);
printf("內存申請錯誤 ");
returnNULL;
}
readByte=fread(r,1,fh.RiffSize-4,fp);
if(readByte!=fh.RiffSize-4)
{
delete[]r;
printf("wave文件長度錯誤%d%d ",readByte,fh.RiffSize);
returnNULL;
}
fclose(fp);
FMT_BLOCK*fb=(FMT_BLOCK*)r;
if(fb->FmtID!=FMT__SIGN_ID)
{
printf("格式標識符錯誤或格式大小錯誤ID:%08X ",fb->FmtID);
delete[]r;
returnNULL;
}
if(fb->wavFormat.FormatTag!=1)
{
delete[]r;
printf("不支持的格式Format:%d ",fb->wavFormat.FormatTag);
returnNULL;
}
pr=r+8+fb->FmtSize;
while(1)
{
UNKNOW_BLOCK*ub=(UNKNOW_BLOCK*)pr;
if(ub->ID==FACT_SIGN_ID)
{
printf("Fact標簽length:%d ",ub->Size);
pr+=8+ub->Size;
}
elsebreak;
}
DATA_BLOCK*db=(DATA_BLOCK*)pr;
if(db->DataID!=DATA_SIGN_ID)
{
delete[]r;
printf("數據錯誤 ");
returnNULL;
}
returnr;
}
BYTE*getWaveData(BYTE*wav,int*dLen)
{
UNKNOW_BLOCK*ub=(UNKNOW_BLOCK*)wav;
while(ub->ID!=DATA_SIGN_ID)
{
switch(ub->ID)
{
caseDATA_SIGN_ID:
break;
caseFMT__SIGN_ID:
caseFACT_SIGN_ID:
ub=(UNKNOW_BLOCK*)(((BYTE*)ub)+ub->Size+8);
break;
default:
printf("錯誤標簽%08X ",ub->ID);
returnNULL;
}
}
DATA_BLOCK*db=(DATA_BLOCK*)ub;
*dLen=db->DataSize;
returndb->Data;
}
size_tgetTotalLen(BYTE*wav)
{
size_tr=0;
UNKNOW_BLOCK*ub=(UNKNOW_BLOCK*)wav;
while(1)
{
switch(ub->ID)
{
caseDATA_SIGN_ID:
r+=ub->Size+8;
returnr;
caseFMT__SIGN_ID:
caseFACT_SIGN_ID:
r+=ub->Size+8;
ub=(UNKNOW_BLOCK*)(((BYTE*)ub)+ub->Size+8);
break;
default:
printf("錯誤標簽%08X ",ub->ID);
returnNULL;
}
}
return-1;
}
voidprintWaveFormat(BYTE*wav)
{
intlen;
getWaveData(wav,&len);
FMT_BLOCK*fb=(FMT_BLOCK*)wav;
printf("Wave格式:PCM ");
printf("通道數量:%d ",fb->wavFormat.Channels);
printf("采樣頻率:%dHz ",fb->wavFormat.SamplesPerSec);
printf("每秒所需位元組數:%d位元組 ",fb->wavFormat.AvgBytesPerSec);
printf("數據塊對齊單位:%d位元組 ",fb->wavFormat.BlockAlign);
printf("每個采樣需要的bit數:%dbit ",fb->wavFormat.BitsPerSample);
printf("長度:%.2f秒 ",(double)len/fb->wavFormat.AvgBytesPerSec);
}
BYTE*catWave(BYTE*&wav1,BYTE*&wav2)
{
FMT_BLOCK*fb1=(FMT_BLOCK*)wav2;
constFMT_BLOCK*fb2=(constFMT_BLOCK*)wav2;
if(
fb1->wavFormat.AvgBytesPerSec==fb2->wavFormat.AvgBytesPerSec&&
fb1->wavFormat.BitsPerSample==fb2->wavFormat.BitsPerSample&&
fb1->wavFormat.BlockAlign==fb2->wavFormat.BlockAlign&&
fb1->wavFormat.Channels==fb2->wavFormat.Channels&&
fb1->wavFormat.FormatTag==fb2->wavFormat.FormatTag&&
fb1->wavFormat.SamplesPerSec==fb2->wavFormat.SamplesPerSec)
{
intlen1=getTotalLen(wav1),len2;
BYTE*Data2=getWaveData(wav2,&len2);
BYTE*nD=newBYTE[len1+len2+10];
if(nD==NULL)returnNULL;
memcpy(nD,wav1,len1);
delete[]wav1;
wav1=nD;
BYTE*Data1=getWaveData(wav1,&len1);
DATA_BLOCK*db1=(DATA_BLOCK*)(Data1-8);
db1->DataSize+=len2;
memcpy(Data1+len1,Data2,len2);
returnwav1;
}
returnNULL;
}
intsaveWaveFile(constchar*name,BYTE*wav)
{
FILE*fp=fopen(name,"wb");
if(fp==0)return0;
intlen=getTotalLen(wav);
RIFF_HEADERrh;
rh.RiffFormat=WAVE_SIGN_ID;
rh.RiffID=RIFF_SIGN_ID;
rh.RiffSize=len+4;
fwrite(&rh,sizeof(rh),1,fp);
fwrite(wav,1,len,fp);
fclose(fp);
return1;
}
❻ C語言播放音頻文件的問題....
可以使用PlaySound()函數播放wav聲音,該函數原型位於windows.h中,
函數原型為:
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
參數pszSound是指定了要播放聲音的字元串,該參數可以是WAVE文件的名字,或是WAV資源的名字,或是內存中聲音數據的指針,或是在系統注冊表WIN.INI中定義的系統事件聲音。如果該參數為NULL則停止正在播放的聲音。
參數hmod是應用程序的實例句柄,當播放WAV資源時要用到該參數,否則它必須為NULL。
參數fdwSound是標志的組合,各種可選的標志及意義如下所示。若成功則函數返回TRUE,否則返回FALSE。
播放標志以及含義:
SND_APPLICATION
用應用程序指定的關聯來播放聲音。
SND_ALIAS
pszSound參數指定了注冊表或WIN.INI中的系統事件的別名。
SND_ALIAS_ID
pszSound參數指定了預定義的聲音標識符。
SND_ASYNC
用非同步方式播放聲音,PlaySound函數在開始播放後立即返回。
SND_FILENAME
pszSound參數指定了WAVE文件名。
SND_LOOP
重復播放聲音,必須與SND_ASYNC標志一塊使用。
SND_MEMORY
播放載入到內存中的聲音,此時pszSound是指向聲音數據的指針。
SND_NODEFAULT
不播放預設聲音,若無此標志,則PlaySound在沒找到聲音時會播放預設聲音。
SND_NOSTOP
PlaySound不打斷原來的聲音播出並立即返回FALSE。
SND_NOWAIT
如果驅動程序正忙則函數就不播放聲音並立即返回。
SND_PURGE
停止所有與調用任務有關的聲音。若參數pszSound為NULL,就停止所有的聲音,否則,停止pszSound指定的聲音。
SND_RESOURCE
pszSound參數是WAVE資源的標識符,這時要用到hmod參數。
SND_SYNC
同步播放聲音,在播放完後PlaySound函數才返回。
************************************************************
例如我想播放在C:\WINDOWS\Media目錄中的 Windows XP 啟動.wav 文件
程序如下:
#include <windows.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
PlaySound("C:\\WINDOWS\\Media\\Windows XP 啟動.wav", NULL, SND_FILENAME | SND_ASYNC);
system("pause");
return 0;
}