2010年1月15日 星期五

HW6

  這次的作業是將 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();

另外上網查了一下有關音訊波形的顯示,目前找不太到,看看有誰能夠教我如何做出來吧。



 

沒有留言:

張貼留言