mpg123源码详解
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源码详解相关推荐
- 【Live555】live555源码详解(九):ServerMediaSession、ServerMediaSubsession、live555MediaServer
[Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的三个类所在的位置: ServerMediaSession.ServerMediaSubsession.Dy ...
- 【Live555】live555源码详解系列笔记
[Live555]liveMedia下载.配置.编译.安装.基本概念 [Live555]live555源码详解(一):BasicUsageEnvironment.UsageEnvironment [L ...
- 【Live555】live555源码详解(八):testRTSPClient
[Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的testRTSPClient实现的三个类所在的位置: ourRTSPClient.StreamClient ...
- 【Live555】live555源码详解(七):GenericMediaServer、RTSPServer、RTSPClient
[Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的三个类所在的位置: GenericMediaServer.RTSPServer.RTSPClient 14 ...
- 【Live555】live555源码详解(六):FramedSource、RTPSource、RTPSink
[Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的三个类所在的位置: FramedSource.RTPSource.RTPSink 11.FramedSou ...
- 【Live555】live555源码详解(五):MediaSource、MediaSink、MediaSession、MediaSubsession
[Live555]live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的四个类所在的位置: MediaSource.MediaSink.MediaSession.MediaSub ...
- 【Live555】live555源码详解(四):Medium媒体基础类
[Live555]live555源码详解系列笔记 7.Media Medai所依赖关系图 依赖Medai关系图 Media和UsageEnvironment关联图
- 【Live555】live555源码详解(二):BasicHashTable、DelayQueue、HandlerSet
[Live555]live555源码详解系列笔记 3.BasicHashTable 哈希表 协作图: 3.1 BasicHashTable BasicHashTable 继承自 HashTable 重 ...
- 【Live555】live555源码详解(一):BasicUsageEnvironment、UsageEnvironment
[Live555]live555源码详解系列笔记 类关系图 1.UsageEnvironment 详解 1.1 BasicUsageEnvironment BasicUsageEnvironment ...
最新文章
- KDE社区:首个KDialogue正式开放
- iOS将产品进行多语言发布,开发
- DBA(五):数据分片、Mycat服务
- html5实例异步图片加载,javascript – 你如何处理html5的画布图像加载异步?
- 你该知道的深度强化学习相关知识
- arcgis xml 下载 切片_arcgis api 4.x for js地图加载arcgisserver本地离线瓦片(附源码下载)...
- Linux性能优化实战:应用的CPU使用率100%,我该怎么办(05)
- 使用showInputDialog显示输入框
- cygwin下载可以用的服务器
- 全国哀悼日,网站黑白素配方法
- SICP 习题2.61~2.62 排序表示的adjoin和union-set函数
- LZJ的圣剑,第二次模拟赛,贪心
- 磊科路由器信号按键_磊科怎么隐藏wifi信号 磊科路由器如何隐藏wifi信号?-192路由网...
- Bochs的初步使用
- 旧电脑搭建linux服务器
- 论文阅读 6 | Bayesian Meta-Learning for the Few-Shot Setting via Deep Kernels
- TP6 控制器不存在:app\index\controller\Index
- Postman+Newman执行自动化测试
- 最受 IT 公司欢迎的 30 款开源软件,你用过几款?
- python中国地图程序设计_神级程序员教你用Python如何画一个中国地图!(好好玩)...
热门文章
- spring、mybatis、mybatis-spring 版本对应
- Python黑帽子编程—使用scapy构造数据包
- c语言循环龙珠,《今天赛亚人也在拯救世界!》c语言黑板擦 ^第5章^ 最新更新:2020-01-09 03:52:51 晋江文学城手机版...
- Multisim基础 更改元件图标
- idea如何使用git从gitlab下载代码
- ADC0809 VHDL控制程序
- RSA加解密过程详解
- 2021年起重机司机(限桥式起重机)多少分及格及起重机司机(限桥式起重机)考试内容
- 系统学习iOS动画之六:3D动画
- 【机械动力学】第三次在线作业