当前位置:首页 » 安卓系统 » android波形图

android波形图

发布时间: 2022-10-03 13:51:54

Ⅰ Android OpenGLES3绘图 - 音频可视化(模仿MIUI系统效果)

小米手机播放音乐时锁屏页面可以设置音频可视化效果,这是用OpenGL绘制出来的,我们来实现一下。

首先简单分析一下原理:
图形的每一行代表一个声音片段,它就是一个一维数组,按照数值大小绘制不同的高度,就形成了一条“山脉”;获取到下一个声音片段后,将它绘制到下面一行,然后画面整体向上滚动就可以了。整体类似于绘制一张游戏里常见的3D地形图。

创建一个MediaPlayer,它可以直接读取res/raw里面的音频文件,start()开始播放

Visualizer是Android SDK里面提供的音频分析工具,它可以直接获取播放的音频的波形和频谱。onWaveFormDataCapture回调方法里返回的是原始的PCM波形数组,onFftDataCapture回调方法里返回的是经过快速傅里叶方法转换后的声音频谱数组,数组的第一位是直流分量,后面是不同频率的数值。

每次获取到的是一组声音数据,将它传给Render绘制。

首先确定图形的长宽,宽度w其实是由每组音频的数组长度决定,可以由Visualizer.getCaptureSizeRange()[0]获取,这里获取的是最小的数组,也可以用Visualizer.getCaptureSizeRange()[1]获取最大的数组;长度h可以自己设置想展示多长。

绘制地形图也就是绘制w * h * 2个三角形,创建vao、vbo和ebo,由于顶点的位置都是固定的,可以在顶点着色器中用gl_VertexID获取,所以vbo里面不用传顶点数据,直接传声音数组。

由于图形是不断刷新最后一行并向上滚动的,那么需要使用一个队列,为了每一帧数据改变最小,不至于进行大量的数组复制和移动。我们 用ByteBuffer vertexBuffer模拟一个循环队列,使用一个行号int lineNum来标记队列的头部。每添加一行数据后,lineNum会加上w,这样ByteBuffer分成了两部分:lineNum * w之后的是新旧数据,之前的是旧数据

现在我们需要将数据从主内存(vertexBuffer)复制到GPU显存(vbo)。vertexBuffer里是一个循环队列,而vbo里面只能顺序保存(因为ebo序号是顺序的,vbo不是顺序图形就会错乱),更新vbo数据缓存的glBufferSubData方法支持设置偏移位置部分更新。那么我们 先将vertexBuffer定位到lineNum * w,将它后面的旧数据复制到vbo的前面;然后将vertexBuffer定位到0,将剩下的新数据复制到vbo的后面 。这样就保证了绘制时从上到下,从旧到新。

为了让颜色更丰富,这里用了地形图中常用的热度渐变色数组。
理论上音频数值是unsigned byte格式的,但是着色器不支持byte格式,我直接用int vPosition接收数据,然而数值范围不再是0~255了,这有点奇怪,我没有深入研究。简单测试了一下,发现取int的前8位,再进行一点比例缩放,用它去渐变色数组里取颜色,会取得较好的显示效果。

顶点着色器
shader_audio_v.glsl

将颜色传给片段着色器显示
shader_audio_f.glsl

最终效果如下图,录屏设置的码率比较低,实际上是很清晰的。

完整项目在 SurfacePaint 项目下的 opengles3 模块里的audio。

Ⅱ 如何得到一段音乐的波形图

下载一个美册,用里面的可视化音频功能制作,美册的可视化音乐做出来以后音乐的波形可以跟着节奏跳动,非常立体,美册的可视化音乐效果非常多,主题非常多,圆形频谱和波形频谱都可以调整


Ⅲ android 绘制心电波形图

参考网上思路写的一个 demo,仅供参考
两个 Bitmap 一个作为橡皮檫在前面每次擦除一段比如 20cm,另外一个 Bitmap 在后面每次画一小段比如 15cm, 中间留一个间隔。

假如界面上始终显示 3秒的波形图,假设每一秒给你 100 个点的数据,那么我 3秒内要画 300 个数据点(1秒要画 100 个点)。
然后根据 view 的宽度就能得到每两个点的间隔 deltaX, 然后 x轴 从零开始间隔 deltaX 画一点就行了,画到头再从头循环。

我 1 秒要画 100 个点,也就是 10毫秒要画一个点(一个线段)。如果一次画一个点界面上划线速度太慢,我们可以一次画多个点(多条线段),比如我可以每次画 10 个点,要在 100毫秒内画完 10 个点(9条线段)。 然后划线时间可以用定时器控制,每隔100毫秒定时器执行一次绘制,绘制 10 个点的数据(这里忽略绘制时间,假设10个点肯定可在100毫秒内画完)。

Ⅳ android x86录音杂音,怎样更改源码能够消除录音杂音

打开Audition软件并将需要处理的音频拖入多轨(即下图所示轨道)中

双击该音频的波形图,即可进入编辑界面

选中有噪音的一小段,(选中这段里面只能有噪音,而不能有人声),可以通过上滑滚轮来放大界面波形,进行精细操作

单击上方选项卡效果>修复>降噪器...弹出下图所示窗口。

点击“获取特性”出现下图波形,再点击波形全选,并将左侧框中参数调为80(可根据噪音大小适当调整,参数越大处理强度越大。)

Ⅳ android 怎么绘制时时音频波形图

安卓开发音频mic口接收20khz的波形的方法? 一、手机音频通信的特点 1、 通用性强:在智能手机普及的今天,手机的对外通信接口多种多样,而其中以3.5mm的音频接口通用新最强,基本所有的手机、平板电脑都会有这个接口,所以在一些要求通用性的设...

Ⅵ android铃声剪辑软件的波形图怎么实现的

首先我先从手机录制声音的原理来给你说吧。
我们的话筒并不能直接录制我们的声音。而是通过我们的声音发出的声波改变了电流量还是电阻忘了的大小,然后我们的手机CPU也就是我们手机的大脑,记录这个变化的过程,当我们要播放我们的录音的时候。手机,再把记录的变化过程还原R铃声剪辑中的波形图,也就是我们的声波形状。有些时候我们会看见波形图,有些时候会高,有些时候会低。

Ⅶ Android画图问题求解(如能解决可追加至少200分)

这玩意正事哥哥要做的,等哥哥做完了告诉你 年底见,别家公司的

Ⅷ 如何给Imageview 设置水波纹效果

假设图片名是[email protected]用[buttonSetBackgroundImage:[UIImageimageNamed:@"myImage"]];就可以了。多少个button公用一张图片都是可以的,不会出现冲突问题,系统会根据这个图片生成N个实例对象。

Ⅸ android编程实现心电图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

class GameView extends SurfaceView implements SurfaceHolder.Callback {
@Override
public void run() {
while (mRun) {
Canvas c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
doDraw(c);
}
} finally {
// do this in a finally so that if an exception is thrown
// ring the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}

private void doDraw(Canvas canvas) {
//draw
}
}

热点内容
c缓存池 发布:2025-01-20 13:23:45 浏览:6
数控编程帅气宝塔图纸 发布:2025-01-20 13:22:15 浏览:871
共享文件夹加密软件 发布:2025-01-20 13:08:41 浏览:40
标识符是怎样存储的 发布:2025-01-20 13:08:39 浏览:894
怎么看安卓大屏什么牌子 发布:2025-01-20 13:08:35 浏览:258
ios开发java 发布:2025-01-20 13:02:42 浏览:881
速腾有侧灯的是哪个配置 发布:2025-01-20 13:01:53 浏览:371
社保用户名和密码都忘记了怎么办 发布:2025-01-20 12:55:55 浏览:321
最优存储形式是什么 发布:2025-01-20 12:51:32 浏览:27
centos编译php7 发布:2025-01-20 12:33:52 浏览:920