就是不知道為什麼?
怎麼弄都不對~~~
一直跑出point to structurerequire on left side of -> or ->"
一直很煩就是不知道為什麼?
Fseek,Fopen,Fread都是照格式來走卻還是不對
還是又是哪裡的格式不對了?
也知道從PSPAD裡面去抓
雖然在PSPAD裡面看的到開頭的RIFF
可是要讀取出來卻沒辦法?
到底哪裡不對了...
數位媒體概論作業繳交園地
Fseek,Fopen,Fread都是照格式來走卻還是不對
還是又是哪裡的格式不對了?
也知道從PSPAD裡面去抓
雖然在PSPAD裡面看的到開頭的RIFF
可是要讀取出來卻沒辦法?
到底哪裡不對了...
Program Name:SourceRIFF
Version: 0.01 alpha
功能:載入一wave檔並將其播出
說真的這個作業其實不難,稍微翻一下BCB的書還有爬一下文,就能知道撥放器怎樣實做了
重點在於WAVE的檔案格式為何?
WAVE的儲存方式其實和BMP類似,一樣是請教wiki
只是發現wiki的資料其實並不完整,沒有提到整個結構個別是做什麼用的
所以在這裡提供一個我所找到的資料
這是我在一個名叫Wotsit網站上查詢到的資料
專門提供各種檔案格式文件給程式設計師的網站
之前學過的BMP或是GIF上面都有
像是商業軟體的Photoshop的PSD格是上面都有收錄
這簡直是個天堂阿~
回到正題
這次教我們利用int的性質來做資料的計算
之前做BMP時碰到要算檔案大小等問題時
每次都要一個個慢慢乘
真的很麻煩
透過運用int就可以簡省很多行程式碼了
真的很方便
老實說 我接下來真的不知道要打什麼了
這次作業比較可惜的是不知道要怎樣把wave的波型輸出
資料的取的是容易
只是我要怎樣才能輸出呢?
說到這個聲音
推薦大家一個免費的聲音編輯器
軟體名稱:Audacity
官方網站:http://audacity.sourceforge.net/
軟體性質:Freeware
這個軟體是跨平台的(MAC Linux上都可運作)
功能媲美GoldWave或是Audition
如果說嫌破解商業軟體麻煩
免費軟體也是個不錯的選擇!!



在做這個作業之前,我先去查了有關WAV的資料,它是屬於無損的音頻格式,簡單來說就是解壓縮時不會產生數據/質量上的損失 ,解壓前和解壓後的數據資料都不會產生流失,既然有無損的音頻格式,就會有所謂的有損的音頻格式,主要是基於聲學心理學的模型,除去人類很難或根本聽不到的聲音,例如:一個音量很高的聲音後面緊跟著一個音量很低的聲音,我們常用的MP3就屬於這一類文件,這是有關於WAV的相關資料。
回到作業上面,這次作業主要的是讀取WAV的檔頭資料,其實弄起來實在不知頭不知尾,之前學的是將圖片的各個資料讀出來,現在變成是要將音樂檔的資料讀出,感覺好像差不多,可是作起來卻覺得還蠻多問題的,MediaPlayer1->Open();MediaPlayer1->Play();這兩行看起來最有感覺,因為平常很常用播放音樂的程式在聽音樂,在製作讀取WAV檔的程式過程中,我也發現要做一個任何檔名都能讀取播放的音樂程式真的不簡單,像是我平常最常用的REALPLAYER,幾乎大部分的影音檔都能正常播出,其實這門課程學到現在,好多應用程式都是我們平常會使用的,或許是我們平常都用習慣了,所以覺得用起來上手順暢,卻萬萬沒有想到光是製作的過程就有很大很大的學問,而且還要花好一番的功夫才能慢慢理解為什麼要這樣去做 。
這次的作業是讀取WAV檔,
前面讀檔頭的動作跟讀BMP大同小異,
首先要先找到WAV的檔頭包了什麼東西,
整塊檔頭有什麼東西相信很多同學都PO了,
這邊我只列出我有用到的地方,
第一個當然就是檔案大小,位置在4,大小為4bytes,
再來是檔案類型,位置在8,大小也是4bytes,
不過檔案類型我也會有類似前面作業的問題,WAVE後面接了一些亂碼,
這個我一個一個字元去看都沒問題,可是整個印出來就是會有後面的東西,
真的不知道是哪來的,老師可以幫我看一下嗎。
char cB[4]={0,0,0,0};
fseek (imWAV,8,SEEK_SET) ;
fread(cB, 4, 1, imWAV);
Memo1->Lines->Add("檔案類型:");
Memo1->Lines->Add(cB);
我的程式裡是這樣寫的,讀出來就會變如圖所示。
第三個是Channel,位置在22,這個只有2個bytes,
最後是取樣率(Sample Rate),位置在24,4個bytes
我只有簡單拿幾個示範一下而已,
反正就是讀檔頭,其他有需要再加上即可,
基本上這作業只要之前讀bmp有認真做就不會很難,
幾乎是一樣的東西。
另外有加檔名上去,
程式裡是這樣寫的,Memo1->Lines->Add(OpenDialog1->FileName.c_str());
但是這樣出來會是絕對路徑,想請問老師有沒有辦法只取檔名就好?

bytes 0~3 顯示RIFF,RIFF的格式是WAV和AVI的基礎

