我的第一個建議是使用某種圖書館來幫助你。大多數聲音解決方案看起來過於矯枉過正,所以一個簡單的庫(就像你的問題的評論libsndfile中推薦的那個)應該可以做到。
如果你只是想知道如何閱讀WAV文件,所以你可以自己寫(因爲你的學校可能會像其他普通人一樣使用圖書館),快速谷歌搜索會給你所有你需要的信息plus some people who have already wrote many tutorials on reading the .wav format。
如果你仍然沒有得到它,這裏是我自己的一些代碼,在這裏我讀取了WAV/RIFF數據文件的頭文件和所有其他數據塊,直到到達數據塊。它基於exclusively off the WAV Format Specification。提取實際的聲音數據並不難:您可以將其讀取爲原始數據並將其轉換爲原始格式,或者轉換爲內部格式(32位PCM未壓縮數據或其他)。
查看下面的代碼時,請將reader.Read...(...)
替換爲調用指定類型的整數值和字節大小的等效fread
。 WavChunks
是一個枚舉其爲WAV文件組塊的內部的ID的小端值,並且format
變量是可被包含在所述WAV文件格式的類型的WAV格式類型中的一種:
enum class WavChunks {
RiffHeader = 0x46464952,
WavRiff = 0x54651475,
Format = 0x020746d66,
LabeledText = 0x478747C6,
Instrumentation = 0x478747C6,
Sample = 0x6C706D73,
Fact = 0x47361666,
Data = 0x61746164,
Junk = 0x4b4e554a,
};
enum class WavFormat {
PulseCodeModulation = 0x01,
IEEEFloatingPoint = 0x03,
ALaw = 0x06,
MuLaw = 0x07,
IMAADPCM = 0x11,
YamahaITUG723ADPCM = 0x16,
GSM610 = 0x31,
ITUG721ADPCM = 0x40,
MPEG = 0x50,
Extensible = 0xFFFE
};
int32 chunkid = 0;
bool datachunk = false;
while (!datachunk) {
chunkid = reader.ReadInt32();
switch ((WavChunks)chunkid) {
case WavChunks::Format:
formatsize = reader.ReadInt32();
format = (WavFormat)reader.ReadInt16();
channels = (Channels)reader.ReadInt16();
channelcount = (int)channels;
samplerate = reader.ReadInt32();
bitspersecond = reader.ReadInt32();
formatblockalign = reader.ReadInt16();
bitdepth = reader.ReadInt16();
if (formatsize == 18) {
int32 extradata = reader.ReadInt16();
reader.Seek(extradata, SeekOrigin::Current);
}
break;
case WavChunks::RiffHeader:
headerid = chunkid;
memsize = reader.ReadInt32();
riffstyle = reader.ReadInt32();
break;
case WavChunks::Data:
datachunk = true;
datasize = reader.ReadInt32();
break;
default:
int32 skipsize = reader.ReadInt32();
reader.Seek(skipsize, SeekOrigin::Current);
break;
}
}
http://www.mega-nerd.com/libsndfile/ http://ccrma.stanford.edu/software/snd/sndlib/是可以幫助您使用WAV的兩個庫 – Patashu 2013-04-18 05:39:55