當前位置:首頁 » 編程軟體 » wav編程

wav編程

發布時間: 2022-08-27 20:29:12

① 求用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();

熱點內容
游戲上雲成標配雲伺服器該怎麼選 發布:2025-02-07 18:26:13 瀏覽:141
哪個安卓手機自帶系統沒有廣告 發布:2025-02-07 18:22:36 瀏覽:724
電腦開機後一直在配置更新怎麼進入系統 發布:2025-02-07 18:17:43 瀏覽:12
新浪上傳視頻在哪 發布:2025-02-07 18:17:38 瀏覽:557
外匯點差演算法 發布:2025-02-07 18:16:41 瀏覽:79
我的世界各種伺服器核心的區別 發布:2025-02-07 18:15:52 瀏覽:678
雲伺服器客戶怎麼轉 發布:2025-02-07 18:13:19 瀏覽:206
什麼漫畫軟體可以緩存 發布:2025-02-07 17:56:21 瀏覽:268
安卓如何取消手機搜索 發布:2025-02-07 17:46:04 瀏覽:218
ontoucheventandroid 發布:2025-02-07 17:45:50 瀏覽:869