Mpg123源代码详解
Mpg123與libmad一樣,支持mpeg1,2,2.5音頻解碼。目前來看mpg123比libmad支持了網(wǎng)絡(luò)播放功能。而且libmad基本上開源社區(qū)在2005年左右,基本停止更新,mpg123至今還在持續(xù)更新源代碼。
1.??????mpg123是如何支持某種音頻驅(qū)動的?
Mpg123跟liamad一樣,向下也支持oss,alsa,win32等驅(qū)動,是如何支持的。Libmad是修改config文件的宏來完成,而mpg123是修改makefile或者configure來完成
ALSA_LIBS =-lasound,同時(shí)也要修改配置文件.config.因?yàn)榇薽akefile只變異一個(gè)驅(qū)動
默認(rèn)只是 alsa驅(qū)動。
2.??????main函數(shù)框架
??? ?mpg123_init();初化mpeg123相關(guān)資源
cleanup_mpg123 =TRUE;? 已經(jīng)初始化后的標(biāo)志置位
mpg123_new_pars(&result)動態(tài)申請一個(gè)結(jié)構(gòu)體,并初始化結(jié)構(gòu)體屬性參數(shù)
mpg123_getpar(mp,MPG123_RVA, ¶m.rva, NULL);
將預(yù)設(shè)的結(jié)構(gòu)體參數(shù),讀取到para這個(gè)結(jié)構(gòu)體參數(shù)中來
getlopt(argc,argv, opts)? 解析main函數(shù)傳入的參數(shù)
如果param.list_cpu為真的話
mpg123_decoders();?列出解碼器資源
解碼完畢mpg123_delete_pars(mp);釋放資源
如果param.test_cpu?存在
mpg123_supported_decoders()?測試cpu屬性
解碼完畢mpg123_delete_pars(mp);釋放資源
正常情況下不會走到這兩個(gè)流程
init_output(&ao)初始化輸出模塊,覺得是輸出到哪個(gè)驅(qū)動還是轉(zhuǎn)碼輸出
have_output =TRUE;? 設(shè)置初始化輸出完畢標(biāo)準(zhǔn)
httpdata_init(&htd);初始化網(wǎng)絡(luò)播放參數(shù)
mpg123_par()將para結(jié)構(gòu)體數(shù)據(jù)在此寫入到mp結(jié)構(gòu)體中來
設(shè)置各種參數(shù)
mh =mpg123_parnew(mp, param.cpu, &result);
將mp參數(shù)讀到fr全局參數(shù)中,供以后的解碼器使用
mpg123_delete_pars(mp)mp參數(shù)現(xiàn)在可以釋放了
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)
設(shè)置實(shí)時(shí)參數(shù),提高該進(jìn)程的優(yōu)先級
prepare_playlist()初始化播放列表
如果需要http://則要打開socket,連接服務(wù)器端
初始化終端,初始化遙控操作
進(jìn)入大循環(huán)解碼播放,每獲取一個(gè)節(jié)目
{
open_track(fname)? 打開解碼器播放打開某個(gè)文件和網(wǎng)絡(luò)讀流
term_control 初始化終端設(shè)置
mpg123_scan(mh);? 完成seek定位
mpg123_seek_frame? 初始化seek
play_frame() 開啟解碼進(jìn)程解碼
每解碼一次進(jìn)行一次按鍵處理
}
播放完畢所有的節(jié)目,釋放資源
?
解碼過程:
play_frame---mpg123_decode_frame---decode_the_frame(mh);
?
如何顯示時(shí)間狀態(tài):
-v 可以將時(shí)間顯示出來。實(shí)現(xiàn)代碼以下:
Main函數(shù)中-------print_stat函數(shù)
(每解一buffer數(shù)據(jù)打印一次)
Parse.c 關(guān)于MP3頭的解析。
?
如何送數(shù)據(jù)?
1.?????? 而在config.h 中#define DEFAULT_OUTPUT_MODULE"alsa"
結(jié)構(gòu)體一定義,就默認(rèn)為
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驅(qū)動
3.?????? 每解碼完畢一個(gè)單元,就flush_output
4.?????? flush_output 通過ao->write 寫入底層 底層通過映射到不同的驅(qū)動
?
structparameter param 這個(gè)結(jié)構(gòu)體很重要,一定義就有個(gè)默認(rèn)值,后面可以通過main函數(shù)參數(shù)去修改該默認(rèn)值或者mpg123_getpar(mp,MPG123_RVA, ¶m.rva, NULL);;將mp參數(shù)傳入到para中。
?
如何實(shí)現(xiàn)播放控制:即如何實(shí)現(xiàn)熱鍵控制?
按鍵邏輯控制在term.c中實(shí)現(xiàn)。
get_key 讀按鍵
term_handle_input按鍵處理
term_handle_key? 按鍵播放控制邏輯
term_control(mh,ao);
main函數(shù)中的大循環(huán)
總結(jié)
以上是生活随笔為你收集整理的Mpg123源代码详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swift 3 网络请求+数据解析
- 下一篇: iOS-- pod常用命令