翻了翻Stack Overflow,也翻了CSDN,没找到太多资料。。。

那么,我还是自己翻官方文档,自己写一个。

这里就记录下过程。8b22ab26ef493287a87a82da4f4b89c6.png

657854cb6a85429ea629009bc432378c.png官方文档说明

334d91505cb0a392aa201c4db6e6f8b8.png官方文档 - 数据存放顺序

54c1a175717917595519b38bbb44d482.png官方文档 - 变换算法

因为我们只想知道音乐的分贝,也就是震级(magnitude),所以我们只需要看有数组变量magnitudes的算法就行了。

首先,我们要使用Visualizer时需要设置。e57e3b0b498270aecd373c5b1929c893.png创建Visualizer对象

08ca0814136fe6c49ce76f854a39c261.png设置

1a200392755ca0ada34b7ae769e1dd96.png设置接收fft数组接口

这里要提醒下,setDataCaptureListener后面有三个值,第一个是设置最大采样值,我们这里设置1024/2就够了,接着是选择我们要哪种接收数组,第一个是waveform,第二个就是我们要的fft,所以我们在第二个true就行了。

记得在使用前启用,推出activity或者关闭屏幕时禁用哦~b57d9333a09764e2a106b78ba9bf15a3.png启用

退出activity后没关闭visualizer重启activity,再使用visualizer时会抛出异常,所以记得禁用哦~659191a5fb0d1aeac2679cc41a75a4f9.png禁用

这里用浮点数组作为存储分贝信息的数组(Java为float[],Kotlin为FloatArray),大小为传递过来fft数组的一半加一。5613c5beaaaa1b28c0a4eef1b428a439.pngKotlin

3b692b27b79d084fd17010f34c8e9754.pngJava

Java与Kotlin算法都是一样,唯一的区别就是语法上。

我们获取到了数据,那么我们在android里自定义一个View,利用刚刚获取的浮点数组数据绘制一个可视化音频柱吧。2f59e8037b9d3ccb126050c99284112b.png绘制(Kotlin)

注释:35b97be4f4c52b23a09ef17d8f4f65f9.png三个变量

cylinderHeight是利用比例计算一个浮点数占用屏幕上高度

diff是每根柱子之间的间隔,我这里利用values的dimen属性设置了1dp

cylinderWidth是利用比例计算每根柱子的长度

当然,由于采样的时间间隔与view绘制完成时间不一样,所以有可能在绘制view的时候浮点数组出现变化,导致了数据的不准确性。所以我在这里添加一个flag,用来检查是否完成绘制。下图中的drawing就是那个flag。27d891dd827dd247e4f142c6b27ce80b.png处理原始字节数据

530a837bd39712a500f325a7bb5bc23a.png自定义View中的onDraw()绘制

b810924a2954f013cedb115465ea0f9b.pngAndroidManifest.xml设置限权

记得在使用visualizer之前获取麦克风限权哦~

效果图5bd4ab66f8a6cc149b135934541ab150.png

8b22ab26ef493287a87a82da4f4b89c6.png

禁止转载

酷安@住在地球真累

Github 1552980358

开源音乐播放器(截图)开源地址 https://github.com/1552980358/MusicPlayer

第二稿,与初稿有部分区别

酷安原稿链接 https://www.coolapk.com/feed/15271345?shareKey=ZjUwZjk2NGI2MGEzNWRmMzQ2ZTM~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐