Android在应用层提供丰富的多媒体接口,本文主要介绍音效处理:均衡器风格、预设混响、重低音调节、音量增强、可视化动态频谱,这些音效都使用audioSessionId进行绑定。让用户可选择/设置自己喜欢的风格,身临其境地感受不同歌曲的跳动旋律。方便开发者进行二次开发,打造出酷炫的音乐播放器。

第一篇文章探讨:MediaPlayer、MediaCodec、AudioTrack、MediaMuxer、MediaExtractor。

第二篇文章探讨:MediaRecorder、AudioRecord、MediaMetadataRetriever、MediaProjection、AudioManager。

第三篇文章探讨:CameraX,即对Camera的封装,提供预览、拍照、录像功能。

目录

一、均衡器风格

二、预设混响

三、重低音调节

四、音量增强

五、可视化频谱

1、申请权限

2、初始化

3、数据的获取与显示

4、释放资源


我们先看下均衡器的各种风格以及其它音效,如下图所示:

一、均衡器风格

均衡器Equalizer,Android源码地址:Equalizer。根据官方介绍,均衡器用于调节音乐源或输出混音的频率增益,频率范围从低到高包括:超低频、低频、中频、高频、超高频。我们可以通过mEqualizer?.bandLevelRange[0]获取频率带宽最小值,通过mEqualizer?.bandLevelRange[1]获取频率带宽最大值,然后获取band个数mEqualizer?.numberOfBands,最终根据最小值、最大值和band个数计算出所有频率带宽。具体实现如下:

        val equalizerList = ArrayList<Pair<*, *>>()mEqualizer = Equalizer(0, mPlayer!!.audioSessionId)mEqualizer!!.enabled = enableEqualizerminEQLevel = mEqualizer!!.bandLevelRange[0]val maxEQLevel = mEqualizer!!.bandLevelRange[1]bands = mEqualizer!!.numberOfBandsfor (i in 0 until bands) {val centerFreq = (mEqualizer!!.getCenterFreq(i.toShort()) / 1000).toString() + " Hz"val pair = Pair.create(centerFreq, mEqualizer!!.getBandLevel(i.toShort()) - minEQLevel)equalizerList.add(pair)}

关于均衡器风格,我们可以使用mEqualizer?.getPresetName(i)来遍历获取,包括古典、舞蹈、民俗、重金属、嘻哈、爵士、流行、摇滚等,如下列表所示:

    NormalClassicalDanceFlatFolkHeavy MetalHip HopJazzPopRock

二、预设混响

预设混响PresetReverb,源码地址:PresetReverb。根据官方介绍,一个房间内产生的声音可以往多个方向传播,当声波经历越来越多的反射到达后,聆听者听到的是随时间衰减的连续混响。它可以在音乐应用程序用来模拟各种环境中播放音乐,或者在游戏中让听众沉浸在游戏环境里。

混响模型有Schroeder模型和Moorer模型。其中Schroeder模型由4个梳状滤波器和2个全通滤波器组成,梳状滤波器提供较长延时,全通滤波器提供较短延时。而Moorer模型在Schroeder基础上提出改进:引入低通滤波器,用于高频衰减;增加前级反馈,用于早反射。

混响参数包括:房间大小、高频衰减系数、延时大小、干湿比、立体声宽度等。

预设混响包括小房间、中等房间、大房间、中等大厅、宽敞大厅等,如下列表所示:

    SmallRoomMediumRoomLargeRoomMediaHallLargeHallPlate

三、重低音调节

重低音BassBoost,源码地址:BassBoost。重低音又称为低音增强,重低音是一种放大或增强低频声音的音频效果,它类似于简单的均衡器,只是限于低频范围内的频带放大。调用mBass?.setStrength(progress.toShort())来调节放大等级。

四、音量增强

音量增强LoudnessEnhancer,一种用于增强声音响度的音乐效果,通过设置目标增益值来决定声音信号放大系数。把LoudnessEnhancer关联到特定的AudioTrack或者MediaPlayer,然后指定从AudioTrack或MediaPlayer获取的audio session id。声音信号的目标增益值默认单位是mB,其中100mB=1dB,当增益值为0mB时,默认不进行信号放大。Android官方提供的源码地址:LoudnessEnhancer。

五、可视化频谱

可视化频谱Visualizer,用于播放音乐时产生可视化数据,让用户享受跳动的旋律。由PCM数据从时域到频域变换,即FFT变换得到频谱。源码地址:Visualizer。

1、申请权限

为了保护用户声音数据的隐私安全,需要申请录音操作权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />

另外,在输出混音(audio session id为0)时,需要申请修改录音的权限:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

如果没有录音权限,直接初始化会报错,因为底层初始化时会检测录音权限,抛出RuntimeException。底层源码如下:

    public Visualizer(int audioSession)throws UnsupportedOperationException, RuntimeException {int[] id = new int[1];synchronized (mStateLock) {mState = STATE_UNINITIALIZED;// native initializationint result = native_setup(new WeakReference<Visualizer>(this), audioSession, id,ActivityThread.currentOpPackageName());if (result != SUCCESS && result != ALREADY_EXISTS) {Log.e(TAG, "Error code "+result+" when initializing Visualizer.");switch (result) {case ERROR_INVALID_OPERATION:throw (new UnsupportedOperationException("Effect library not loaded"));default:throw (new RuntimeException("Cannot initialize Visualizer engine, error: "+result));}}mId = id[0];if (native_getEnabled()) {mState = STATE_ENABLED;} else {mState = STATE_INITIALIZED;}}}

2、初始化

在初始化时,需要设置captureSize每次采样的数据量,通过Visualizer.getCaptureSizeRange()[1]来获取。另外,获取采样率Visualizer.getMaxCaptureRate() / 2,注册数据监听接口回调,然后调用visualizer.setEnabled(true)来开启音频数据的采集处理。具体接口如下:

open fun setDataCaptureListener(listener: Visualizer.OnDataCaptureListener!, rate: Int, waveform: Boolean, fft: Boolean
): Int

3、数据的获取与显示

音频内容的展示有两种捕获类型:

方波数据:连续8位(无符号)单声道采样,调用getWaveform(byte[] waveform)方法。

频率数据:8位幅度的FFT傅立叶变换,调用getFFT(byte[] fft)方法。

4、释放资源

在音乐播放结束时,需要调用释放可视化频谱的相关资源。先关闭可视化频谱器,注销监听接口,最后调用release来释放资源。需要注意的是,我们在release之前,先注销监听接口,不然有些机型(比如vivo的一些特定机型)会报错。

    int captureRate = Visualizer.getMaxCaptureRate() / 2;visualizer.setEnabled(false);visualizer.setDataCaptureListener(null, captureRate, false, false);visualizer.release();

至此,关于音效处理的均衡器、混响、重低音、音量增强、可视化频谱介绍完毕。

Android音视频全面介绍与代码实践之音效(四)相关推荐

  1. Android音视频点/直播模块开发实践总结-zz

    随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能.那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及 ...

  2. Android音视频——基础介绍

    视频编码 视频编码所谓的视频编码就是指通过特定的压缩技术,将某个视频格式文件转换成另一种视频格式文件的方式.视频流传输中最重要的编解码标准有国际电联的 H.261.H.263.H.264,运动静止图像 ...

  3. 英语流利说 Android 音视频处理相关实践与优化

    前言: 移动互联网的火爆改变了人们一系列的生活方式,从社交.购物.教育等方方面面渗透进大众的生活,移动端的迅速崛起和高速发展离不开移动端背后的技术演进和迭代,产品更新迭代过程中如何优化它的性能?实际实 ...

  4. android音视频介绍(一)

    最近抽空回顾了下之前做过的一个音视频项目,突然发现曾经有踩过不少的坑,刚好这几天有时间就把这些东西整理了下,分享出来吧... 首先介绍下android中有关音视频播放使用到的类 : MediaPlay ...

  5. Android音视频入门及架构介绍

    一.多媒体基础 音视频格式 一个视频文件的格式由封装格式+音频码流格式+视频码流格式+字幕流组成. 如下为一个视频文件的信息,是asf封装的wmav2音频+mpeg4视频. 常用的视频格式 MPEG系 ...

  6. 谈谈对Android音视频开发的探究

    ​ 在日常生活中,视频类应用占据了我们越来越多的时间,各大公司也纷纷杀入这个战场,不管是抖音.快手等短视频类型,虎牙.斗鱼等直播类型,腾讯视频.爱奇艺.优酷等长视频类型,还是Vue.美拍等视频编辑美颜 ...

  7. Android 音视频开发(一) -- 使用AudioRecord 录制PCM(录音);AudioTrack播放音频

    前言,音视频这块,确实比较难入门,本着学习的态度,我这边也跟着 Android 音视频开发入门指南 打怪升级,留下个脚印,大家共勉. 音视频 系列文章 Android 音视频开发(一) – 使用Aud ...

  8. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  9. Android 音视频开发入门指南

    最近收到很多网友通过邮件或者留言说想学习音视频开发,该如何入门,我今天专门写篇文章统一回复下吧. 音视频这块,目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的,希望我后面能挤出时间整 ...

最新文章

  1. jQuery学习笔记一
  2. 来,锁个痛快(6)—— 与lock相关的视图和简单实验
  3. IAR stm8 调试时无法看到局部变量解决
  4. Oracle expdp/impdp导出导入命令及数据库备份
  5. 装修要找大品牌还是游击队,还是包工头?
  6. 淘淘商城:显示查询页面
  7. J-Octa 使用MD和MO/DFT计算相对介电常数
  8. Linux cp 复制文件强制覆盖的用法
  9. 好名字——能看出方法特征的名字才是好名字
  10. 面试题,移动端APP测试常见bug记录
  11. consulandnacos
  12. 一些常用的ubuntu软件安装方式
  13. 端午节蓝屏之谜:金山系列软件同微软KB2839229冲突技术分析
  14. 姿态估计之3D 人体姿态估计 - 总结(1)【转】
  15. 深度学习之Bottleneck Layer or Bottleneck Features
  16. STM32 CubeMx LL库-ADC操作
  17. 图像切割--Seam Carving算法
  18. 现代CMake高级教程 - 第 1 章:添加源文件
  19. linux 读卡器信息,读卡器是怎么读取信息的?
  20. 刘清扬老师《银行对公营销》课程大纲

热门文章

  1. mc服务器违反协议,Mojang开始向违反EULA的服务器发出通告
  2. 2022年微信小程序真机调试全流程及10大常见问题处理
  3. 【数据库实验】实验四 基于嵌入SQL的综合应用编程(基于QSqlTableModel实现)
  4. 2020微信小微商户、微信支付商业版签约商户流程
  5. windows聚焦壁纸不更新_Win10系统下聚焦锁屏壁纸无法自动更换怎么解决
  6. Linux处理cds文件,Linux 使用CDS磁盘+LVM
  7. 如何建立Multi-Step(多步预测)的LSTM时间序列模型(以对家庭用电预测为例)
  8. XMOS学习笔记1: XMOS基础知识
  9. poj 1383 Labyrinth 树的直径
  10. spring boot静态资源文件的访问以及自定义