這次的作業是將 WAV 檔頭資料顯示出來,所以就先上網去找尋有關檔頭的資料,不過沒有在wiki上找到,不過在另外的網站找到了。
wav檔前面的44個byte是檔頭,紀錄著有關此wav的資料
以下是我在網路上找到的介紹
1 0...3 str4 "RIFF" in ASCII 存放的是RIFF字串
2 4...7 int4 Total bytes minus 8 存放的是資料區塊大小
資料區塊大小=(檔案大小-8)
3 8...15 str4 "WAVEfmt" Eigth character is a space 存放的是WAVE字串、子區塊識別名
4 16...19 int4 16 for PCM format 存放的是子區塊大小
5 20...21 int2 1 for PCM format 存放的是聲檔格式,0x0001表PCM格式
6 22...23 int2 channels 存放的是聲道數
7 24...27 int4 sampling frequency 存放的每秒取樣數
8 28...31 int4 bytes per second 存放的是每秒資料量
每秒資料量=(聲道數*位元數*每秒取樣數/8)
9 32...33 int2 bytes by capture 存放的是子區塊位元組
子區塊位元組=(位元數/8)
10 34...35 int2 bits per sample 存放的是取樣位組元數
11 36...39 str4 "data" 存放的是data字串
12 40...43 int4 bytes in data 實際聲檔大小,這個值為檔案大小減去檔頭(44BYTE)後的值
有了這些資料後就能開始寫程式了,寫法大致上跟之前讀BMP檔的標頭差不多,不過在這次作業使用了unsigned int 的方式,好用許多,不用像之前要使用一長串的程式碼才能讀出,看起來也比較簡潔一點。我只取出一些我比較有興趣的8個檔頭資料,剛開始第一個和第二個在顯示時會跑出一些亂碼出來,後來查資料,在不要的後面加上NULL,就不會取到RIFF和WAVE後面的亂碼了,這是我程式其中一個取檔案大小的程式碼:
fseek(imWAV,4,SEEK_SET);
fread(c, 1, 4, imWAV);
iFileSize = c[0];
Label4->Caption=("File Size="+AnsiString(iFileSize + 8));
會了之後,其它的也就不難了。最後能讓音樂能在BCB上播放,要再加上
MediaPlayer1->FileName=OpenDialog1->FileName;
MediaPlayer1->Open();
MediaPlayer1->Play();
另外上網查了一下有關音訊波形的顯示,目前找不太到,看看有誰能夠教我如何做出來吧。
沒有留言:
張貼留言