当前位置:首页 » 编程语言 » c语言wav

c语言wav

发布时间: 2024-10-01 15:34:49

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 x0dx0a#include x0dx0a#include x0dx0a#pragma comment(lib, "winmm.lib")x0dx0ax0dx0avoid main(){x0dx0aPlaySound (TEXT("D:\\zzz\\zzd.wav"), NULL, SND_ASYNC | SND_NODEFAULT);x0dx0a x0dx0awhile (1) x0dx0a{x0dx0a printf("program is running... here\n"); //这里跑你的程序,按 Ctrl-C 组合键,结束程序。x0dx0a Sleep(1000); //休息1秒x0dx0a}x0dx0ax0dx0aexit(0);x0dx0a}

❸ 【求大神指导】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;
}

热点内容
discuz友情链接缓存 发布:2024-11-24 19:00:11 浏览:693
数据库时区 发布:2024-11-24 18:28:30 浏览:614
板的塑性算法 发布:2024-11-24 18:17:59 浏览:29
酷狗缓存乱码 发布:2024-11-24 18:12:42 浏览:509
aes算法模式 发布:2024-11-24 17:47:19 浏览:612
linux查看端口是否占用 发布:2024-11-24 17:42:15 浏览:467
手机电影天堂的文件夹 发布:2024-11-24 17:39:08 浏览:690
吉林金税盘安全服务器地址 发布:2024-11-24 17:39:00 浏览:277
360无法访问网络 发布:2024-11-24 17:32:48 浏览:558
普通员工解压拓展注意什么细节 发布:2024-11-24 17:32:06 浏览:435