wav编程
① 求用vc编写一个播放wav的播放器的编程思路或代码
第一:找到能够播放wav格式的函数
第二:编写函数实现
我有资料,但是你要做的话,还是自己动手的好,毕竟你自己做了才能得到乐趣
② 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;
}
③ 如何通过编程去掉录制的WAV文件中的杂音
GoldWave(声音编辑,播放,录制,和转换的音频工具) v5.20简体中文绿色版 软件名称: GoldWave(声音编辑,播放,录制,和转换的音频工具) 软件大小: 2.21 MB 软件语言: 简体中文 软件类别: 汉化软件-媒体工具-音频处理 运行环境: WinNet, WinXP, Win2K, NT,.. 授权方式: 正式软件集声音编辑,播放,录制,和转换的音频工具,体积小巧, 功能却不弱。可打开的音频文件相当多,包括WAV, OGG, VOC, IFF, AIF, AFC, AU, SND, MP3,MAT, DWD, SMP, VOX, SDS, AVI, MOV等音 频文件格式,你也可以从 CD 或 VCD 或 DVD 或其它视频文件中提取 声音。内含丰富的音频处理特效,从一般特效如多普勒、回声、混响 、降噪到高级的公式计算(利用公式在理论上可以产生任何你想要的 声音),效果多多。 更新: 添加“检测更新”选项。 升级 WMA 插件,支持更高的分辨率。 升级 FLAC 插件到 1.1.4 版本。 在状态栏添加配置缩放项菜单。 在批处理中添加部分信息选项。 自动剪裁添加更多控制选项。 修正:开始菜单中的帮助链接错误,指定查看的开始错误,XAC 文件的采样速率错误,中止处理错误,CD 数据选择列表的滚动栏错 误,保存 CD 音轨数据有用户帐户限制的错误。
④ 如何用C语言编写程序将多个wav文件拼接成一个音频wav文件并播放
这不是三言两语的事情,合作wav文件操作并不简单。要研究好wav文件结构,读取文件头,再进行分析和操作。
有两种办法:
1.连续播放,例如:
#include<stdio.h>
#include<windows.h>
#include<mmsystem.h>
#pragmacomment(lib,"winmm.lib")
intmain(){
PlaySound("C:\Users\wang\test1.wav",NULL,SND_FILENAME);
PlaySound("C:\Users\wang\test2.wav",NULL,SND_FILENAME);
PlaySound("C:\Users\wang\test3.wav",NULL,SND_FILENAME);
return0;
}
2.系统自带的“windows movie maker”。运行windows movie maker,然后选择“导入音频或音乐”之后把你需要的文件添加进来。然后按照你自己需要排列的顺序把这些文件依次拖到下方的时间线上。然后点左上方的“文件”选项,最后保存电影文件即可。
⑤ 如何编程把wav格式转换成mp3格式
在你编程环境下,引入音频编解码的SDK或者接口库就可以调用了,具体你可以用哪种,你得看你的环境支持什么了,接口文档看看就好了。
⑥ 怎么用c语言播放特定目录里的wav文件
用C语言播放音乐,一般需要额外的库或者调用系统的API函数。
以Windows为例,可以通过PlaySound函数播放wav格式的音乐。示例如下,代码在vc6.0中编译通过。
#include<stdio.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
int main()
{
PlaySound(TEXT("1.wav"),0,SND_FILENAME); //1.wav是要播放的音乐文件
return 0;
}
如果想播放mp3音乐可以使用如下代码。
注意:生成程序后,请在cmd中执行此程序,不要在vc/vs的IDE中运行。#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#pragma comment(lib, "Winmm.lib")
int main(int argc, char *argv[])
{
//绝对地址形式
TCHAR fileName[]="ganlusi.mp3";
TCHAR shortName[MAX_PATH];
GetShortPathName(fileName,shortName,sizeof(shortName)/sizeof(TCHAR));
TCHAR cmd[MAX_PATH+10];
wsprintf(cmd,"play %s",shortName);
mciSendString(cmd,NULL, 0, NULL);
Sleep(5 * 60 * 1000); //这里是防止一播放就结束做的延迟
return 0;
}
⑦ 请问如何自制.wav文件
disk or the
⑧ 编程C或C++ 把raw的音频文件转为wav格式
RAW文件也就是PCM文件,想构造wav格式你需要知道这个声音的采样率和每个采样值的所占的位数,一般为8或者16.有了这两个才可以构造出完整的wav文件头。
文件头就是文件的说明信息,本质上就是C语言中的结构体,虽然不知道的时候觉得很神秘哈,wav文件头包含下边三个
struct RIFF_HEADER //RIFF文件都有这个东东,压缩的图片、视频都有
struct WAVE_FORMAT//这个比较重要,是说明格式的,包含声道、采样率、每个采样值的比特位等
struct FMT_BLOCK//数据部分说明的一个头,后边跟的就是数据了,
我是做流媒体的,不会了可以再问
⑨ 怎样编程实现txt文本生成wav文件
微软的SAPI(Speech Application Programming Interface)提供了强大的Text To Speech接口,而且支持自动化。这样可以在.Net的程序中引入该COM组件:
先添加SpeechLib的引用,在系统盘Program Files\Common Files\Microsoft Shared\Speech目录中找到sapi.dll。
在代码中调用SpVoiceClass类的Speak方法可以实现简单的句子发言:
ISpeechVoice v=new SpVoiceClass();
v.Speak(txtSpeak, SpeechVoiceSpeakFlags.SVSFDefault);
还可以用SpFileStream创建音频流,如下面程序可以把文本“读到”wav文件中:
//Declare the SpVoice object.
ISpeechVoice v=new SpVoiceClass();
//Create a wave stream
SpFileStream s = new SpFileStream();
//Create a new .wav file for writing.
s.Open("out.wav", SpeechStreamFileMode.SSFMCreateForWrite, false);
//Set the .wav file stream as the output for the Voice object
v.AudioOutputStream = s;
//Call the Speak method now will send the output to the .wav file.
v.Speak(txtSpeak, SpeechVoiceSpeakFlags.SVSFDefault);
//Close the file
s.Close();