使用libzplay庫封裝一個音頻類


裝載請說明原地址,謝謝~~

     前兩天我已經封裝好一個duilib中使用的webkit內核的瀏覽器控件和一個基於vlc的用於播放視頻的視頻控件,這兩個控件可以分別用在放酷狗播放器的樂庫功能和MV功能上,也可以用於其他duilib項目,說起來做仿酷狗程序,但是至今我雖然把仿酷狗的主界面做好了,但是還沒有播放音樂的功能,所以今天就再封裝一個音頻類。
    我以前並不怎么使用音頻和視頻的功能,所以對常用的視頻庫和視頻庫不太了解,而我肯定不會使用系統的win32控件或者MFC里面的類,因為多數系統自帶的功能還不能滿足我的需求。我需要一個小巧但是功能足夠做出仿酷狗的效果的音頻庫,昨天晚上在群里向群友們打聽有什么好用的音頻庫,大家推薦了幾個,比如 ffmpeg,PortAudio,SDL,bass,libzplay。
    我分別找了這幾個庫的資料,ffmpeg不用多少,功能強大眾所周知,不過他技能播放音頻又能播放視頻,用他封裝個音頻庫就殺雞焉用牛刀了。SDL是一套開源的跨平台多媒體開發庫,使用C語言寫成。bass是個輕量級的音頻庫,功能方面還不夠強大。libZPlay庫集成了所有支持格式(mp3, mp2, mp1, ogg, flac, ac3, aac, oga, wav and pcm )的編碼解碼器。庫本身是由WINAPI編寫,你無須額外的庫,也不需要MFC / .NET的支持,只能在Windows下運行。
    對比了一下,感覺這個libZPlay比較適合,因為我寫的程序只面向windows平台,不需要跨平台,而且liZPlay支持常用的音頻格式,也不需要附帶額外的庫,使用也比較簡單。這個libZPlay不光能播放音樂,還能錄音,繪制音頻圖像,支持一些音樂特效。恰巧昨天在群里和群友交流時得知網友花落半歌也在做音樂播放器,也使用的是這個庫。
    去官網下載了libzplay的最新版本libzplay-2.02-sdk,庫的二進制文件大約2M,使用是添加libzplay.h頭文件和libzplay.lib庫文件就可以了。先打開作者給的demo,發現每個demo都挺簡單,都是控制台工程,我編譯了VC對應的工程的example1 demo,先使用了一下,感覺功能對我來說足夠了,使用截圖如下

    可以看到上方是控制按鈕,通過對應的按鈕可以控制音樂效果,控制功能還是很全面的,比如聲音漸弱、漸強、回音、通道混合、均衡器、去除某個音軌。我隨便找了一個音樂改變了一下音樂特效,很有意思的是可以把做出各類的人聲,從女性變到男性,變成怪物音或者小孩音。
    demo的代碼淺顯易懂,我對應着demo里使用的函數把libZPlay庫封裝為CMusicPlayer類,對應設demo的函數封裝很簡單

    如果要配合duilib,讓音頻庫可以主動通知主窗體,去改變音樂狀態,比如反饋當先已經播放了多長時間, 是否播放完畢等就需要再封裝幾個回調函數的接口,libZPlay庫自帶了回調通知的函數,其原型為:
virtual int __stdcall SetCallbackFunc(TCallbackFunc pCallbackFunc,TCallbackMessage nMessages, void *user_data) = 0;
    第一個參數是回調函數,回調函數的原型要定義為這樣typedef int  (__stdcall * TCallbackFunc)(void* instance, void *user_data, TCallbackMessage message, unsigned int param1, unsigned int param2); 第二個參數代表要通知的消息的類型,由我們自己選擇比如,MsgPlay|MsgStop|MsgNextSong,代表了當音樂播放、停止、換歌時會調用回調函數。有了這個我們使用音頻庫結合duilib就更簡單了,在回調函數里,可以再使用更多的詳細的來自主窗體的回調函數,通過回調函數分類去操作界面 ,或者可以用消息機制發消息給主窗體去讓主窗體自己改變行為。
    到此主要內容就說完了,封裝完后,我封裝的這個類頭文件138行代碼,源文件493行代碼。
    另外群里先后好多人詢問怎么使用duilib自帶的MenuDemo,因為自帶的MenuDemo沒有增加消息通知的接口,所有很多人不會用,我打算再寫一篇日志,說明一下給MenuDemo怎么增加接口 ,讓他可以去通知主窗體一些事件。詳見后面的日志。
 

2014.7.27  15:19  Redrain 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM