2010年1月8日 星期五

HW6


課程後半段時間開始介紹影音的部分,我大概了解到影音檔其實跟影像檔的組成方式有很多相像的地方,影音和影像都有許多不同的壓縮法,分門別派那樣,很有趣,而這個作業要我們讀取音樂檔的標頭,其實方法跟影像檔大同小異,但這次讀檔特別教了 unsigned int 這個方便的用法,不用像之前使用int陣列的變數來讀檔還需要自己計算才正確,unsigned int 佔4個byte,而且一次讀取4個byte之後電腦自己看得懂抓進來的數值,會自動幫你計算,也不用特別去轉換。

不過開始寫的時候發現維基百科給的標頭檔資料非常貧乏,之後自己去找了資料(上圖),照著給的資料把標頭檔一一讀進來,後來也問了老師 SampleRateByteRate 的差別,SampleRate是指每秒取樣的最大量,而ByteRate是實際上取樣的次數,ByteRate是SampleRate的四倍,那是因為音樂檔是雙聲道,所以要乘4倍

寫這次程式其實不難,但還是有碰到一些小問題。
問題(1). 標頭檔讀進來後,字串的部分莫名其妙連續串在一起

這個問題發現後,我找到一個簡單的方法解決,就是把變數設成全域變數,問題雖然解決了,但我還是不懂為什麼,於是去問老師,得到一個淺顯易懂的答案,原來設在Button裡他可能會把陣列設在同一排記憶體空間,所以當他讀到的時候會發現在記憶體空間裡接下去的也是字串,會一併把他列出來,所以解決方法也很簡單,只要當初設陣列的時候多設一個去放NULL,當他讀到的時候會發現接下來是NULL就不會繼續讀下去了。
問題(2).聲道一直讀錯
這問題我就不附圖了!聲道莫名的一直讀成千位數字,後來找到方法是一開始設變數的時候設成
unsigned int channelnumber={0}; 就正確了,很奇怪對吧?如果知道為什麼請答覆我,感謝~
再來就放上讀WAV音樂檔的標頭圖片,我把全部的標頭檔都讀出來囉!!
只是有些還是不太懂是代表什麼...
既然WAV和AVI都是用RIFF定義的,我也來讀讀看AVI檔,果然也成功了,而且我還做了撥放影音的功能,比較不一樣的是我使用Panel來播放,畫面很精緻吧!只是標頭檔果然還是有差別,很多地方都不符合,影音這部分還存在很多問題,想找到方法讓電影整個畫面都能撥出(自動設定大小),還有讀字幕檔的功能也不會,不過快期末了影音檔這部分有空再研究囉~~





1 則留言: