最近项目中需要实时获取播放音频的频率,并绘制波形图,用到了Visualizer这个类,记录下其使用方法:

Visualizer.OnDataCaptureListener有两个回调方法,分别是onFftDataCapture和onWaveFormDataCapture,onFftDataCapture返回的是经过傅里叶变换处理后的音频数据,onWaveFormDataCapture返回的是声音的波形数据。

计算声音分贝部分代码:

val readyData = readyData(fft)val interval = readyData.size / (lineCount * 2)for (i in readyData.indices step interval) {...    val magnitude = readyData[i] * readyData[i] + readyData[i + 1] * readyData[i + 1] * 1.0    val dbValue = (10 * log10(magnitude)).toLong().coerceAtLeast(0) // 声音大小}private fun readyData(fft: ByteArray): ByteArray {    val newData = ByteArray(256) // 取一半    for (i in 0 until fft.size.coerceAtMost(256)) {        newData[i] = abs(fft[i].toInt()).toByte()    }    return newData}

Visualizer的使用:

class VisualizerHelper {    private var visualizer: Visualizer? = null    private var mediaPlayer: MediaPlayer? = null    /**     * 播放音乐     */    fun playMusic(        path: String,        onCompletionListener: MediaPlayer.OnCompletionListener,        onDataCaptureListener: Visualizer.OnDataCaptureListener    ) {        mediaPlayer = MediaPlayer().apply {            setDataSource(path)            setOnCompletionListener {                onCompletionListener.onCompletion(it)                release()                releaseVisualizer()                mediaPlayer = null            }        }        mediaPlayer?.prepare()        mediaPlayer?.start()        initVisualizer(onDataCaptureListener)    }    /**     * 停止播放     */    fun stopMusic() {        mediaPlayer?.run {            stop()            release()        }        mediaPlayer = null        releaseVisualizer()    }    /**     * 获取当前播放进度     */    fun getCurrentPosition(): Long {        return (mediaPlayer?.currentPosition ?: 0) / 1000L    }    private fun initVisualizer(        dataCaptureListener: Visualizer.OnDataCaptureListener    ) {        if (visualizer != null) {            visualizer?.enabled = true            return        }        visualizer = Visualizer(mediaPlayer?.audioSessionId ?: 0)        visualizer?.run {            captureSize = Visualizer.getCaptureSizeRange()[1] // 设置可视化数据的数据大小            setDataCaptureListener(                dataCaptureListener,                Visualizer.getMaxCaptureRate() / 2, // 采集频率                false,                true            )            enabled = true        }    }    /**     * 释放     */    private fun releaseVisualizer() {        visualizer?.run {            enabled = false            release()        }        visualizer = null    }}

更多相关文章

  1. Content Providers
  2. Android利用BitMap获得图片像素数据的方法
  3. Android(安卓)ORM 框架:GreenDao 使用详解
  4. 简易音乐播放器(Android(安卓)Studio)
  5. Android(安卓)RecyclerView异步更新数据导致的崩溃问题
  6. android sqllite数据库的多表联合查询
  7. Android(安卓)Studio使用JDBC连接MySQL出现java.lang.Unsupporte
  8. Android简易聊天室软件(HTTP实现)
  9. android:DataBinding使用小结(一)

随机推荐

  1. Android的adb命令介绍
  2. Android(安卓)SDK 4.2 正式版发布
  3. android定位并获取城市
  4. Android建筑图像过滤器,如Instagram(1)
  5. android 兼容各个版本 读取通讯录
  6. Android约束布局
  7. Android多媒体学习三:实现自己的Camera
  8. JBox2D 引擎 for Android(安卓)详解
  9. Android高人必修 Ant 编译Android工程
  10. 2014-11-8Android学习------Android(安卓