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, &param.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, &param.rva, NULL);;将mp参数传入到para中。

如何实现播放控制:即如何实现热键控制?

按键逻辑控制在term.c中实现。

get_key 读按键

term_handle_input按键处理

term_handle_key  按键播放控制逻辑

term_control(mh,ao);

main函数中的大循环

mpg123源码详解相关推荐

  1. 【Live555】live555源码详解(九):ServerMediaSession、ServerMediaSubsession、live555MediaServer

    [Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的三个类所在的位置: ServerMediaSession.ServerMediaSubsession.Dy ...

  2. 【Live555】live555源码详解系列笔记

    [Live555]liveMedia下载.配置.编译.安装.基本概念 [Live555]live555源码详解(一):BasicUsageEnvironment.UsageEnvironment [L ...

  3. 【Live555】live555源码详解(八):testRTSPClient

    [Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的testRTSPClient实现的三个类所在的位置: ourRTSPClient.StreamClient ...

  4. 【Live555】live555源码详解(七):GenericMediaServer、RTSPServer、RTSPClient

    [Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的三个类所在的位置: GenericMediaServer.RTSPServer.RTSPClient 14 ...

  5. 【Live555】live555源码详解(六):FramedSource、RTPSource、RTPSink

    [Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的三个类所在的位置: FramedSource.RTPSource.RTPSink 11.FramedSou ...

  6. 【Live555】live555源码详解(五):MediaSource、MediaSink、MediaSession、MediaSubsession

    [Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的四个类所在的位置: MediaSource.MediaSink.MediaSession.MediaSub ...

  7. 【Live555】live555源码详解(四):Medium媒体基础类

    [Live555]live555源码详解系列笔记 7.Media Medai所依赖关系图 依赖Medai关系图 Media和UsageEnvironment关联图

  8. 【Live555】live555源码详解(二):BasicHashTable、DelayQueue、HandlerSet

    [Live555]live555源码详解系列笔记 3.BasicHashTable 哈希表 协作图: 3.1 BasicHashTable BasicHashTable 继承自 HashTable 重 ...

  9. 【Live555】live555源码详解(一):BasicUsageEnvironment、UsageEnvironment

    [Live555]live555源码详解系列笔记 类关系图 1.UsageEnvironment 详解 1.1 BasicUsageEnvironment BasicUsageEnvironment ...

最新文章

  1. KDE社区:首个KDialogue正式开放
  2. iOS将产品进行多语言发布,开发
  3. DBA(五):数据分片、Mycat服务
  4. html5实例异步图片加载,javascript – 你如何处理html5的画布图像加载异步?
  5. 你该知道的深度强化学习相关知识
  6. arcgis xml 下载 切片_arcgis api 4.x for js地图加载arcgisserver本地离线瓦片(附源码下载)...
  7. Linux性能优化实战:应用的CPU使用率100%,我该怎么办(05)
  8. 使用showInputDialog显示输入框
  9. cygwin下载可以用的服务器
  10. 全国哀悼日,网站黑白素配方法
  11. SICP 习题2.61~2.62 排序表示的adjoin和union-set函数
  12. LZJ的圣剑,第二次模拟赛,贪心
  13. 磊科路由器信号按键_磊科怎么隐藏wifi信号 磊科路由器如何隐藏wifi信号?-192路由网...
  14. Bochs的初步使用
  15. 旧电脑搭建linux服务器
  16. 论文阅读 6 | Bayesian Meta-Learning for the Few-Shot Setting via Deep Kernels
  17. TP6 控制器不存在:app\index\controller\Index
  18. Postman+Newman执行自动化测试
  19. 最受 IT 公司欢迎的 30 款开源软件,你用过几款?
  20. python中国地图程序设计_神级程序员教你用Python如何画一个中国地图!(好好玩)...

热门文章

  1. spring、mybatis、mybatis-spring 版本对应
  2. Python黑帽子编程—使用scapy构造数据包
  3. c语言循环龙珠,《今天赛亚人也在拯救世界!》c语言黑板擦 ^第5章^ 最新更新:2020-01-09 03:52:51 晋江文学城手机版...
  4. Multisim基础 更改元件图标
  5. idea如何使用git从gitlab下载代码
  6. ADC0809 VHDL控制程序
  7. RSA加解密过程详解
  8. 2021年起重机司机(限桥式起重机)多少分及格及起重机司机(限桥式起重机)考试内容
  9. 系统学习iOS动画之六:3D动画
  10. 【机械动力学】第三次在线作业