java visualizer_Android Visualizer利用快速傅里叶变换实现获取音频即时音频震级
翻了翻Stack Overflow,也翻了CSDN,没找到太多资料。。。那么,我还是自己翻官方文档,自己写一个。这里就记录下过程。官方文档说明官方文档 - 数据存放顺序官方文档 - 变换算法因为我们只想知道音乐的分贝,也就是震级(magnitude),所以我们只需要看有数组变量magnitudes的算法就行了。首先,我们要使用Visualizer时需要设置。创建Visualizer对象设置设置接收
翻了翻Stack Overflow,也翻了CSDN,没找到太多资料。。。
那么,我还是自己翻官方文档,自己写一个。
这里就记录下过程。
官方文档说明
官方文档 - 数据存放顺序
官方文档 - 变换算法
因为我们只想知道音乐的分贝,也就是震级(magnitude),所以我们只需要看有数组变量magnitudes的算法就行了。
首先,我们要使用Visualizer时需要设置。
创建Visualizer对象
设置
设置接收fft数组接口
这里要提醒下,setDataCaptureListener后面有三个值,第一个是设置最大采样值,我们这里设置1024/2就够了,接着是选择我们要哪种接收数组,第一个是waveform,第二个就是我们要的fft,所以我们在第二个true就行了。
记得在使用前启用,推出activity或者关闭屏幕时禁用哦~
启用
退出activity后没关闭visualizer重启activity,再使用visualizer时会抛出异常,所以记得禁用哦~
禁用
这里用浮点数组作为存储分贝信息的数组(Java为float[],Kotlin为FloatArray),大小为传递过来fft数组的一半加一。
Kotlin
Java
Java与Kotlin算法都是一样,唯一的区别就是语法上。
我们获取到了数据,那么我们在android里自定义一个View,利用刚刚获取的浮点数组数据绘制一个可视化音频柱吧。
绘制(Kotlin)
注释:
三个变量
cylinderHeight是利用比例计算一个浮点数占用屏幕上高度
diff是每根柱子之间的间隔,我这里利用values的dimen属性设置了1dp
cylinderWidth是利用比例计算每根柱子的长度
当然,由于采样的时间间隔与view绘制完成时间不一样,所以有可能在绘制view的时候浮点数组出现变化,导致了数据的不准确性。所以我在这里添加一个flag,用来检查是否完成绘制。下图中的drawing就是那个flag。
处理原始字节数据
自定义View中的onDraw()绘制
AndroidManifest.xml设置限权
记得在使用visualizer之前获取麦克风限权哦~
效果图

禁止转载
酷安@住在地球真累
Github 1552980358
开源音乐播放器(截图)开源地址 https://github.com/1552980358/MusicPlayer
第二稿,与初稿有部分区别
酷安原稿链接 https://www.coolapk.com/feed/15271345?shareKey=ZjUwZjk2NGI2MGEzNWRmMzQ2ZTM~
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)