關鍵字: 播放器 示波器 vb.net directsound9 作者:董含君
轉載請注明來自 http://blog.csdn.net/a11s
作為一個播放器最基本的功能.比如豪杰 winamp mediaplayer real quicktime 等等 都有自己的示波器.某些還提供接口允許plugin 添加更多的圖形效果.
很多人做的播放器沒有這個基本的功能,大概是因為絕大多數都是直接使用了mediaplayer或者realone的控件緣故.至于這些,本文暫不討論.本文介紹一些基本知識,以及實現的步驟方法.其中可能會用到directsound以及directdraw的一些知識.
1 directsoundcapture:從錄音開始
先來看看錄音,當時我們建立了一個buffer用于寫數據.這些數據其實就是我們用來示波的.只不過需要經過一些變化.你可以直接顯示出buffer的內容.
2 directsound播放的時候
我們new 了一個buffer讀取了wav,下一步自然是play.注意一點你會發現有個read() 方法,可以讀取緩沖區的內容.取出來看看確實是我們當時寫進去的東西.
3 畫線
用數字來表示不夠直觀,因為我們已經習慣了看圖像來感知聲音的變化規律.那么我們可以考慮利用directdraw把buffer的內容圖像化.首先利用read()方法得到一塊byte(),然后用for循環來畫圖,至于什么時候調用read(),你可以使用一個timer.注意:這么做的目的是為了說明里面的數據與圖像的規律.而不是完美的示波器.相關directdraw的使用可以參見我原來發的托管的directdraw9.因為為了保證速度,除了ddraw之外想不出更好的辦法了.
右下是繪制出來的圖像(感謝大風 提供的fps算法)點擊放大 1024x768 這個blog我不大會用
根據聲音的變化圖像會發生響應的變化.但是你會感覺跟winamp的不一樣.下面會詳細解釋為什么.現在你只要"知其然"就夠了.這個實際上是windows錄音機用的示波器.
4 關于riff文件
經過上次的wav capture,應該理解riff是什么東西了.根據a/d轉換的結果,儲存到緩沖區,然后在根據文件格式的不同進行格式化(結構體大小不同).沒有壓縮的wav實際上就是一段a/d轉換的結果加上文件頭罷了.轉換候由于是由模擬信號轉來的,聲音的變化實質上就是一個連續曲線.有興趣的化,你可以自己做一個wave editor.即使用鼠標也能畫出聲音來
5 a/d d/a轉換的相關 不想了解可以跳過去,這里告訴你"所以然"
明白了它,你就可以自己做均衡器了.但是本文先不討論.
采樣率:就是a/d轉換時候的發生頻率,請參閱接口技術 單片機 等相關資料.由于我也不是非常了解,說錯了的地方希望您能夠批評指正.
把模擬音頻轉成數字音頻的過程,就稱作采樣,簡單地說就是通過波形采樣的方法記錄1秒鐘長度的聲音,需要多少個數據。44khz采樣率的聲音就是要花費44000個數據來描述1秒鐘的聲音波形。原則上采樣率越高,聲音的質量越好.
位數:簡言之,就是精度,比如24位的就具有24位轉換精度.
其實還有一個聲強級.這里不需要我們做太多關心.(主要是怕說錯)
結合riff文件的特性,你可以知道多少buffer是你應該read()的,然后每個字節表示什么含義
6 真正的示波器,類似winamp的
他們是以多少hz來分的,從1k 到 10k 到 32k 到....
實際上就是把我們的數據進行整合得到的,算出從0到1k有多少,然后累加.顯示在示波器上.
剛才我們顯示的是"內容",winamp顯示的是"數量",因為人的耳朵對某一段的數據較為敏感,而不想機器采樣.舉個簡單的例子.人能感覺到重低音,這時winamp的某斷區域能夠看出急劇增長,而我們原來的示波器看不出,頂多看出音量的變化.
了解到了實質自己再作示波器就沒有壓力了.
7 圖形化的示波器以及對外提供的接口
繪制過程實際上就是一個繪制函數,你把這一段buffer的"特點"傳遞過去(甚至可以傳遞整個buffer)它就會根據參數繪制響應的圖案,當然可以增加自己的特色,比如常用的衰減(聲音結束之后不是一下子沒了圖像,而是漸漸的消失)這樣連貫起來,人感覺比較舒適.對外提供了接口,任何人都可以利用他來做自己的圖形化示波器.
相關請參考plugin的原理以及制作過程,強烈建議學習winamp的
8 其他格式的文件.
以上僅僅針對wav做出了一些解釋.其他的格式比如mp3,不能直接這么做,但是原理是一樣的.畢竟播放的時候需要進行d/a轉換.你需要通過將mp3額結果轉成類似riff的buffer,然后播放.僅此而已
=======end==============
中國最大的web開發資源網站及技術社區,