Audio Analyser

发布于: 5/25/2022 阅读大约需要1分钟

音频分析器主要用来获取音频的频域时域 数据, 便于用户进行可视化展示

使用

创建分析器


const analyser = ctx.createAnalyser()

analyser.fftSize = 2**11 // 设置快速傅里叶变换窗口大小, 取值为2^5 至 2^15, 默认 2048

获取频域数据

  • Uint8Array: analyser.getByteFrequencyData()
  • Float32Array: analyser.getFloatFrequencyData()

获取时域数据

  • Uint8Array: analyser.getByteTimeDomainData()
  • Float32Array: analyser.getFloatTimeDomainData()

例子

创建一个声波图


/**
* index.html
* <audio id="audio" src="./demo.m4a"></audio>
*/

const ctx = new AudioContext()

const audioElement = document.querySelector('#audio')

// 获取音频标签的音频数据流

const source = ctx.createMediaElementSource(audioElement)

// ------- Analyser --------

const analyser = ctx.createAnalyser()

analyser.fftSize = 2048
const canvas = document.querySelector('#wave')
const canvasCtx = canvas.getContext('2d')
const arraybuffer = new Uint8Array(canvas.width)
let interval = null
audioElement.onplay = draw

audioElement.onstop = () => clearInterval(interval)

function draw() {
	interval = setInterval(() => {
		canvasCtx.fillStyle = '#f8f8f8';
		canvasCtx.fillRect(0, 0, canvas.width, canvas.height)
		analyser.getByteFrequencyData(arraybuffer)
		canvasCtx.lineWidth = 2
		arraybuffer.forEach((y, x) => {
			y = canvas.height - (y / 128) * canvas.height / 4
			const c = Math.floor((x * 255) / canvas.width)
			canvasCtx.fillStyle = "rgb(" + c + ",0," + (255 - x) + ")"
			canvasCtx.fillRect(x, y, 2, canvas.height - y)
		});
	}, 1000 * canvas.width / 48000)
}

analyser.connect(ctx.destination)
source.connect(analyser)

效果