前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android FFmpeg系列06--音频可视化

Android FFmpeg系列06--音频可视化

作者头像
雪月清
发布2022-09-21 14:56:15
1.5K0
发布2022-09-21 14:56:15
举报

引言

音频可视化,就是将声音的变化以视觉的方式呈现出来

我们在上篇文章中通过FFmpeg解码了本地mp4文件的音频码流为PCM数据,并通过AudioTrack进行播放

Android FFmpeg系列05--音频解码与播放

播放流程如下

在这个流程中,直接体现音频特征,可用于可视化绘制的就是PCM数据

PCM表示各采样时间点上音频信号的强度,如果我们需要体现各频率点上信号强度变化的话,那么需要先对PCM数据做傅立叶变换

(信号从时域转换为频域)

PCM数据是时间离散的,需要用离散傅立叶变换(DFT)

其中N为时域离散信号的点数,n为时域离散信号的编号(取值范围为0~N-1),m为频域信号的编号(取值范围为0~N-1),频域信号的点数也为N

因此离散傅里叶变换的输入为N个离散的点(时域信号),输出为N个离散的点(频域信号,频域信号的每个点都用一个复数表示)

DFT的特性

(来自参考1)

直接采用公式计算长度为N的序列的DFT,时间复杂度是非常高的

实际应用中我们一般采用快速傅立叶变换(FFT),支持FFT的开源库也非常多,比如Ne10

Ne10的编译与使用

Visualizer

从前面的内容我们可以知道音频可视化涉及的知识点是非常多的,不过我们只需要了解基本原理即可,Google已经提供好了用于音频可视化的轮子,直接拿来用就行

Android系统提供了Visualizer 类,它能让app拿到当前正在播放音频的音频波形数据和FFT数据,用于快速实现音频可视化

一般使用方式如下:

  • 首先获取RECORD_AUDIO的权限(主要是为了保护某些语音信息的隐私,比如语音邮件)
  • 用audio sessioin ID创建Visualizer 类,传0可获取混音后的可视化数据,传特定播放器或者AudioTrack提供的ID,可获取它们播放音频的可视化数据
  • 调用setCaptureSize方法设置每次获取的数据大小
  • 调用setDataCaptureListener方法设置数据回调并制定获取数据频率和数据类型
  • 调用setEnabled方法开始获取数据
  • 不需要使用时调用release方法释放资源

在FFmpeg系列教程提供的Demo中,我们添加初始化的Visualizer逻辑

当FFmpeg实时解码音频PCM数据并喂给AudioTrack后,通过Visualizer 不停回调FFT数据

FFT数据的布局如下

以设置captureSize为1024为例:

每1024个实数点放入一个数组,进行FFT变换后得到1024个复数点,其中一共

1 + 1 + (1024 - 2) / 2 = 513个有效FFT数据

获取振幅,然后使用OpenGL或者自定义View绘制即可

这里采用自定义View绘制,音频可视化圆形效果如下

Visualizer输出的数据大小正比于音量,所以测试的时候手机音量不能调节为0,为0的话输出数据也是0,自定义View上就只能看到一个圆了

最后

网易云音乐大前端团队曾经有篇文章里面说到使用系统Visualizer存在兼容性问题,在有些机型上会导致系统音效失效,如果要在所有机型上都能无副作用的展示音频动效,需要自定义Visualizer,感兴趣的同学可以看看这篇文章,也就是下面的参考1

参考

1.【Android音频可视化】

https://blog.csdn.net/m0_47390782/article/details/109484598

2.【dft公式是什么】

https://baijiahao.baidu.com/s?id=1725625050147421696&wfr=spider&for=pc

~~END~~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雪月清的随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档