【Android项目】本地FM收音机开发及源码简析
2023-04-26 11:09:25发布 浏览468次 信息编号:50304
友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。
【Android项目】本地FM收音机开发及源码简析
[项目] 本地FM收音机开发及源码分析
目录
1 概述
本地FM(收音机)应用不同于现在的网络FM(喜马拉雅、考拉等),它是手机硬件的调谐芯片,接收并解调频率调制(FM)或幅度调制(AM)电台发出的电磁波信号,从而播放和显示相应的节目信息。 因此,本地广播应用一般不需要联网,其核心依赖于硬件调谐芯片。 所以不是所有的手机都能收听本地电台,但是大部分手机都支持。
2.无线电的基本原理
收音机的核心原理是:广播播音员播放的音频经设备处理成电信号,用无线电波进行调频或调幅发射。 信号放大等操作输出到扬声器,将电信号还原为音频信号。
上面提到的调制方式有两种:AM( )/FM( );
那么为什么需要调制呢?
因为正常情况下,人能听到的声音频率在20-20Khz之间。 声波的传输介质是空气,但衰减很大,传输距离很短,大约几十米。 所以直接用声波传输是不现实的。 但无线电波在空气中传播的介质是电磁场,传播距离远。 因此,声波转换为电信号并用无线电波调制后,具有远距离传输的特点。
AM( )方式:将信号波的信号调制在载波上,改变载波的幅度。频率在503---
FM( )方式:信号波的信号被调制在载波上,改变载波的频率。 FM 范围是 76-,在我国是 87.5-,在日本是 76-90MHz。
收音机接收信号并进行解调和放大,通过扬声器还原音频。
3.其他电台信息RDS功能
RDS的全称是“Radio Data”无线数据广播系统; 上面我们只讲了信号波的传输,如果只有信号波,电台显示的信息会很单调。 只能显示当前频率。 不过除了这些,电台还有站名、节目信息、介绍等相关信息。 这时候就需要RDS来完成了。 它利用调频广播传输信号中的副载波,以数字形式发送电台名称等信息。 在收音机端,具有RDS功能的调谐芯片解析出信息并显示出来。
因此,使用RDS的前提是收音机和收音调谐芯片必须同时支持RDS功能; 但目前只有少数电台支持 RDS。
RDS有两个核心功能:AF和TA;
AF是指当当前电台信号低于一定值时,自动搜索该电台信号好的其他频道并自动切换。 为了达到更好的用户体验。
TA功能是强制播放功能。 如有重大事故、紧急通知等交通信息,将强制切换到该频率播放。
具体的RDS功能,可以搜索【FM收音机_RDS功能概述及编码】进行深入了解。
4.开发FM收音机源码分析
首先让我们看一下层次结构
硬件(由芯片厂商提供)->HAL(遵循HAL接口协议)->C动态库(JNI调用)->()->(逻辑和接口)。
此类隐藏在系统 API 中。 如果要编译进去,需要做处理,可以自己查,不过应该是需要获取.jar的。
下面我用一个时序图来展示,先不讨论层级如何设计框架,先看看如果在App中调用tune(...)方法播放某个电台,并通过那个一些过程。
上面的时序图是根据8.0的源码绘制的。 其实9.0的源码和8.0的radio还是有不少区别的。 demo的结构变多了,源码中App的radio demo在目录:
-8.0.0_r1\\apps\Car\Radio\src\com\\car\radio\
上面的时序图好像少了什么?
HAL好像直接和它交互,中间不应该有jni吗; 所以我们找到目录
-8.0.0_r1\\base\core\jni\io.cpp
我们知道jni起到了java和c的桥梁作用。 其实java中的方法和c中的方法是一一映射的,或者说java的方法对应jni,处理c的方法。
那么我们来看看这些类的方法
.java 中的方法:
看io.cpp中的对应
我们看到了什么?
.java中的方法都在io.cpp中,只是方法名都加了固定的前缀,这只是jni的一个特点。 说明这两个文件可以对应上传。
让我们看看,例如
(void *) 方法查看执行了什么
查看.hal文件中的tune方法
好像是排队的。
5、如何在App层设计本地FM应用
上面我们简单说了下Tuner底层的调用流程。 那么问题来了,我是本地FM应用开发者,这一切我都做了。 关我什么事? 其实不然,理解了这些原则,可以让我们调试的时候更容易定义问题。 底层不会错吧? 而且在定制的系统上,如果定制radio,底层会根据需求修改,所以也不稳定。
那么如何设计应用层的框架结构呢?
答:根据需求。 . .
假设我的需求是这样的,好吧,不是假设,其实我的项目需求是这样的。
不说话,看图。
简述要求:
1- 主界面( )下方有一个控制面板,可以对电台进行操作。
2-单击控制面板的空白区域以打开收音机页面。 电台界面可操作显示,采集。状态与外接控制面板一致
3- 外部可扩展控制、面板控制、语音控制等;
4- 遵循音频聚焦策略
分析:
1- 控制面板的显示:以桌面小部件的形式显示。 通过无线电与 App FM 互动。
2- 单击空白区域以打开并启动界面。 在界面上操作,但需要考虑如果直接通过控制面板操作的话,不用启动也能玩。 所以必须有一个核心服务在后台运行,不依赖于接口。
3- 外部控件也应该和交互。需要考虑它的可扩展性
4- 监控焦点增益和损失并执行逻辑处理。
设计:
经过以上分析,我们梳理出以下几个核心点
实际运行的核心服务
主界面
控制面板
代码设计模式:这个自己看吧调频手机收音机,这里用到了MVP模式。 然后会有两个:
无线电核心操作(包括音频处理)
最喜欢的操作
对于其他外部控件,只需要设计数据交互方式即可。
最后:
来一张草图
算了,我自己也看不清楚,就用灵魂画一个新的吧。
是不是更清楚了? 这个图很清楚调频手机收音机,应该很清楚。 不说话,看图。
6.总结
本文简要介绍了本地电台发展的一些知识和资料。 网上还是比较少的。 通过自己的项目经验,在此输出这篇文章。 个人能力有限,难免有失误。
提醒:请联系我时一定说明是从星空网上看到的!