Mpg123源代码详解

    xiaoxiao2026-09-19  6

    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 源代码解析 soucecode and codec
    最新回复(0)