做了个音乐播放器 就一直想做个加一个音乐频谱的展示界面

觉的这是一个好玩的东西,可以将耳边动听的声音形象化,仿佛眼前可以看到声音一样。

但是我在文档的开发者指南里没有讲任何有关音乐频谱的东西,最后还是在google的源码示例中找到了。

你可以直接去参看源代码更原滋原味  以下只是个人对着源码的重构和理解

所有以下所讲的功能,均需要在2.3以上的sdk中才能实现。

音频频谱的获取

首先音频的频谱相关的类叫做 android.media.audiofx.Visualizer;

需要权限

android:name="android.permission.RECORD_AUDIO"/>

所以要做的第一件事 是初始化一个visualizer出来

//使用音乐的sessionId来实例化这个类

mVisualizer

= new Visualizer(mMediaPlayer.getAudioSessionId());

//设置每次捕获频谱的大小,音乐在播放中的时候采集的数据的大小或者说是采集的精度吧,我的理解,而且getCaptureSizeRange()所返回的数组里面就两个值

.文档里说数组[0]是最小值(128),数组[1]是最大值(1024)。

mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);

//接下来就好理解了设置一个监听器来监听不断而来的所采集的数据。一共有4个参数,第一个是监听者,第二个单位是毫赫兹,表示的是采集的频率,第三个是是否采集波形,第四个是是否采集频率

mVisualizer.setDataCaptureListener(new

Visualizer.OnDataCaptureListener() {

//这个回调应该采集的是波形数据

@Override

public void onWaveFormDataCapture(Visualizer visualizer, byte[]

waveform,

int samplingRate) {

//waveformView 是一个自定义的view用来按照波形来画图 一会后面再讲

waveformView.updateVisualizer(waveform);

}

//这个回调应该采集的是快速傅里叶变换有关的数据,没试过,回头有空了再试试

@Override

public void onFftDataCapture(Visualizer visualizer, byte[]

fft,

int samplingRate) {

// TODO Auto-generated method stub

}

}, Visualizer.getMaxCaptureRate() / 2, true, false);

以上波形的数据采集就完成了,需要注意的一个点是mVisualizer.setEnabled(true);

这个方法的主要作用是为了控制何时去采集频谱数据,你应该只是愿意采集你所关心的音乐数据,而不关心声音输出器中任何的声音。而且对mVisualizer的许多设置必须在setEnable之前完成。并且结束功能后,要记得setEnable(false)

如果你见到了以下这个错误,那基本上就是因为没有及时setEnable(false),导致setCaptureSize()这个方法出错。

E/AndroidRuntime(22259): Caused by:

java.lang.IllegalStateException: setCaptureSize() called in wrong

state: 2

顺带再说一个bug 如果你得到的错误代码是 -1 那么基本上的原因是你忘记了声明权限

android:name="android.permission.RECORD_AUDIO"/>

音频频谱的展示

你在上一节已经通过监听器获得了波形数据,那么如何展示?这仅仅是一个自定义view的问题,简单废话一下:重点提一下view中的onDraw()方法

@Override

protected

void onDraw(Canvas canvas) {

super.onDraw(canvas);

//mBytes就是采集来的数据 这里是个大小为1024的数组,里面的数据都是byts类型,所以大小为-127到128

if (mBytes == null) {

return;

}

if (mPoints == null || mPoints.length <

mBytes.length * 4) {

//mPoints主要用来存储要画直线的4个坐标(每个点两个坐标,所以一条直线需要两个点,也就是4个坐标)

mPoints = new float[mBytes.length * 4];

}

mRect.set(0, 0, getWidth(), getHeight());

//xOrdinate是x轴的总刻度,因为一次会传输过来1024个数据,每两个数据要画成一条直线,所以x轴我们分成1023段。你要是觉的太多了,也可以像我一样除以2,看自己需求了。

int xOrdinate = (mBytes.length - 1)/2;

//以下的for循环将利用mBytes[i] mBytes[i+1]

这两个数据去生成4个坐标值,从而在刻画成两个坐标,来画线条

for (int i = 0; i

//第i个点在总横轴上的坐标,

mPoints[i * 4] = mRect.width() * i / xOrdinate;

//第i个点的在总纵轴上的坐标。他在画线上以总纵轴的1/2为基准线(mRect.height() /

2),所有的点或正或负以此线为基础标记。

//((byte) (mBytes[i] +

128))这个一直没有理解,如果+128是为了将数据全部换算为正整数,那么强转为byte后不又变回-127到128了么??要是谁知道原因可以留言告诉我.....

//(mRect.height() / 2) /

128就是将二分之一的总长度换算成128个刻度,因为我们的数据是byte类型,所以刻画成128个刻度正好

mPoints[i * 4 + 1] = mRect.height() / 2+ ((byte) (mBytes[i] + 128))

* (mRect.height() / 2) / 128;

//以下就是刻画第i+1个数据了,原理和刻画第i个一样

mPoints[i * 4 + 2] = mRect.width() * (i + 1) / xOrdinate;

mPoints[i * 4 + 3] = mRect.height() / 2 + ((byte) (mBytes[i + 1] +

128)) * (mRect.height() / 2) / 128;

}

//循环结束后,就得到了这一次波形的所有刻画坐标,直接画在画布上就好了

canvas.drawLines(mPoints, mForePaint);

}

做的音乐软件 纯粹好玩 就放在了国内的market上

有兴趣的可以玩玩 表扬和吐槽 都接受.....呵呵 想一起学习的也欢迎

android录音频谱动画,android获取和展示音乐的频谱相关推荐

  1. java音频频谱,android获取和展示音乐的频谱

    https://blog.csdn.net/aiynmimi/article/details/53189076 (Android音频进阶 Equalizer,Visualizer,BassBoost, ...

  2. android录音声波动画,Android开发:仿微信 录音声波

    最近在仿微信开发聊天界面:开发到一个有意思的小东西,简单写一写.就是录音声波这块. 首先先添加几个图片 添加如上三个声波图表 之后建立一个数组 private int[] images = {R.mi ...

  3. android录音波浪动画_Android使用音频信息绘制动态波纹

    在一些音乐类应用中, 经常会展示随着节奏上下起伏的波纹信息, 这些波纹形象地传达了声音信息, 可以提升用户体验, 那么是如何实现的呢? 可以使用Visualizer类获取当前播放的声音信息, 并绘制在 ...

  4. android录音波浪动画_Android实现波浪效果 - WaveView

    效果图 先上效果图 screenshot.gif 实现 WaveView的属性 WaveView的属性 Wate Level(水位) - 波浪静止时水面距离底部的高度 Amplitude(振幅) - ...

  5. android录音波浪动画_Android 自定义波浪动画--让进度浪起来~

    waveview <Android 自定义波浪动画之"让进度浪起来~"> 转载请注明来自 傻小孩b_移动开发(http://www.jianshu.com/users/ ...

  6. android 指示器平移动画,Android实现带指示器的自动轮播式ViewPager

    前言 最近在做项目的时候,有个需求就是实现自动轮播式的ViewPager,最直观的例子就是知乎日报顶部的ViewPager,它内部有着好几个子view,每个一段时间便自动滑动到下一个item view ...

  7. android 录音的格式,Android录音mp3格式实例详解

    Android录音支持的格式有amr.aac,但这两种音频格式在跨平台上表现并不好. MP3显然才是跨平台的最佳选择. 项目地址 实现思路概述 在分析代码前,我们需要明确几个问题 1. 如何最终生成M ...

  8. android 自定义园动画,Android动画:一个等待动画的制作过程

    看到一个很好玩的gif等待动画,记录一下制作过程. 先上图,展示一下这gif. 图中四个空心圆,一个实心园,依次作规则双星运动. 三个晚上,目前已经已经实现了.又学到了不少东西,这几天把博客写完. 放 ...

  9. android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画

    android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透 ...

最新文章

  1. 如何获得当前运行模块在进程地址空间的位置
  2. dos下实现延迟功能
  3. Ubuntu 16.04 下安装VMware Tools(三行命令搞定,亲测好使)
  4. nginx监听事件流程
  5. 软件设计师备考知识03
  6. 【Redis3】基于Redis sentinel的自动failover主从复制
  7. Linux 命令(25)—— cp 命令
  8. Linux程序文件状态,linux 文件状态标识和IO操作方式
  9. 孙鑫-MFC笔记一--Windows程序内部运行机制
  10. python如何识别文件中的空行?
  11. 多周期MIPS CPU硬布线控制器设计
  12. Hadoop(一) Centos7 下Hdoop 安装及伪分布式集群部署
  13. 基于spss的非线性回归(non-linear regression)
  14. 人工智能发展史(读书笔记)
  15. golang使用gomonkey和monkey来mock方法或者函数时报panic: permission denied [recovered]
  16. eCharts二三维地图总结
  17. Windows Server 2012 R2 系统配置指南_戴有炜编著
  18. 两分钟内教会你如何给视频加配音,快速掌握配音技巧!
  19. 腿麻脚软警告,体虚者勿入!
  20. java 工作流 jbpm,J2EE工作流管理系统jBPM详解(一)(4)

热门文章

  1. “2012年全国职业院校技能大赛”高职组信息安全管理与评估赛项获奖名单
  2. iTOP3A5000_7A2000开发板龙芯全国产处理器LoongArch架构核心主板
  3. 深度学习中的Normalization总结(BN/LN/WN/IN/GN)
  4. matlab中check,使用dynare的check命令是遇到的问题
  5. mysql数据库查询余额_MySQL 数据库(三):查
  6. 美国 计算机科学专业硕士 就业,美国硕士留学:就业最好及最差的硕士学位
  7. android对view截图后,保存图片黑色背景问题
  8. 火车票购票信息系统-Java
  9. 装部署VMware vSphere 5.5文档 (6-2) 为IBM x3850 X5服务器安装配置VMware ESXi
  10. 蓝桥杯综合实训平台 使用AIP15F2K61S2/STC89C52 控制矩阵键盘