Mpg123源代码详解
Mpg123與libmad一樣,支持mpeg1,2,2.5音頻解碼。目前來看mpg123比libmad支持了網絡播放功能。而且libmad基本上開源社區在2005年左右,基本停止更新,mpg123至今還在持續更新源代碼。
1.??????mpg123是如何支持某種音頻驅動的?
Mpg123跟liamad一樣,向下也支持oss,alsa,win32等驅動,是如何支持的。Libmad是修改config文件的宏來完成,而mpg123是修改makefile或者configure來完成
ALSA_LIBS =-lasound,同時也要修改配置文件.config.因為此makefile只變異一個驅動
默認只是 alsa驅動。
2.??????main函數框架
??? ?mpg123_init();初化mpeg123相關資源
cleanup_mpg123 =TRUE;? 已經初始化后的標志置位
mpg123_new_pars(&result)動態申請一個結構體,并初始化結構體屬性參數
mpg123_getpar(mp,MPG123_RVA, ¶m.rva, NULL);
將預設的結構體參數,讀取到para這個結構體參數中來
getlopt(argc,argv, opts)? 解析main函數傳入的參數
如果param.list_cpu為真的話
mpg123_decoders();?列出解碼器資源
解碼完畢mpg123_delete_pars(mp);釋放資源
如果param.test_cpu?存在
mpg123_supported_decoders()?測試cpu屬性
解碼完畢mpg123_delete_pars(mp);釋放資源
正常情況下不會走到這兩個流程
init_output(&ao)初始化輸出模塊,覺得是輸出到哪個驅動還是轉碼輸出
have_output =TRUE;? 設置初始化輸出完畢標準
httpdata_init(&htd);初始化網絡播放參數
mpg123_par()將para結構體數據在此寫入到mp結構體中來
設置各種參數
mh =mpg123_parnew(mp, param.cpu, &result);
將mp參數讀到fr全局參數中,供以后的解碼器使用
mpg123_delete_pars(mp)mp參數現在可以釋放了
dump_open()目前還沒理解是什么意思
audio_capabilities(ao,mh); 初始化音頻輸出
load_equalizer(mh);載入音頻均衡算法腳本
sp.sched_priority= sched_get_priority_min(SCHED_FIFO);
?????? ?if (sched_setscheduler(0, SCHED_RR, &sp) == -1)
設置實時參數,提高該進程的優先級
prepare_playlist()初始化播放列表
如果需要http://則要打開socket,連接服務器端
初始化終端,初始化遙控操作
進入大循環解碼播放,每獲取一個節目
{
open_track(fname)? 打開解碼器播放打開某個文件和網絡讀流
term_control 初始化終端設置
mpg123_scan(mh);? 完成seek定位
mpg123_seek_frame? 初始化seek
play_frame() 開啟解碼進程解碼
每解碼一次進行一次按鍵處理
}
播放完畢所有的節目,釋放資源
?
解碼過程:
play_frame---mpg123_decode_frame---decode_the_frame(mh);
?
如何顯示時間狀態:
-v 可以將時間顯示出來。實現代碼以下:
Main函數中-------print_stat函數
(每解一buffer數據打印一次)
Parse.c 關于MP3頭的解析。
?
如何送數據?
1.?????? 而在config.h 中#define DEFAULT_OUTPUT_MODULE"alsa"
結構體一定義,就默認為
structparameter param = {
?FALSE , /* aggressiv */
?FALSE , /* shuffle */
FALSE , / * remote */
FALSE , /*remote to stderr */
?DECODE_AUDIO , /* writesamples to audio device */
?FALSE , /* silent operation*/
FALSE , /* xterm title on/off */
?0 ,???? /* second level buffer size */
0 ,???? /* verbose level */
?DEFAULT_OUTPUT_MODULE,?????
2.?????? moudule_name 傳入init_output---open_module(legad_audio.c)----
mpg123_output_module_info---alsa驅動
3.?????? 每解碼完畢一個單元,就flush_output
4.?????? flush_output 通過ao->write 寫入底層 底層通過映射到不同的驅動
?
structparameter param 這個結構體很重要,一定義就有個默認值,后面可以通過main函數參數去修改該默認值或者mpg123_getpar(mp,MPG123_RVA, ¶m.rva, NULL);;將mp參數傳入到para中。
?
如何實現播放控制:即如何實現熱鍵控制?
按鍵邏輯控制在term.c中實現。
get_key 讀按鍵
term_handle_input按鍵處理
term_handle_key? 按鍵播放控制邏輯
term_control(mh,ao);
main函數中的大循環
總結
以上是生活随笔為你收集整理的Mpg123源代码详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swift 3 网络请求+数据解析
- 下一篇: iOS-- pod常用命令