JavaScript+Canvas實現(xiàn)繪制音頻可視化波形圖
1. 效果演示

上圖演示了音頻的波形隨著音樂的節(jié)奏而跌宕起伏
2. 基本概念說明
2.1 音頻源節(jié)點
音頻數(shù)據(jù)的來源,是音頻處理的其中一個環(huán)節(jié)
2.2 時域圖

聲音信號是一維的時域信號,無法觀察出頻率隨時間的變化規(guī)律
橫軸代表時間, 縱軸是信號的變化(振幅)
2.3 頻譜圖

任何信號(當(dāng)然要滿足一定的數(shù)學(xué)條件),都可以通過傅立葉變換而分解成一個直流分量(也就是一個常數(shù))和若干個(一般是無窮多個)正弦信號的和
每個正弦分量都有自己的頻率和幅值,頻率值作橫軸,幅值作縱軸
3. 案例代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Canvas在音頻可視化的應(yīng)用</title>
</head>
<body>
<canvas></canvas>
<audio src="./1.mp3" controls></audio>
<script>
const audio = document.querySelector('audio')
const canvas = document.querySelector('canvas')
const con = canvas.getContext('2d')
// 初始化canvas的尺寸
canvas.width = window.innerWidth // 窗口的內(nèi)部寬度
canvas.height = window.innerHeight / 2 //窗口的內(nèi)部高度
document.body.style.backgroundColor = '#000000' // 背景顏色設(shè)置為黑色
// 定義數(shù)組和音頻分析器
let dataArray, analyser
audio.onplay = () => {
// 初始化
const audCon = new AudioContext() // 創(chuàng)建音頻上下文
const source = audCon.createMediaElementSource(audio) // 創(chuàng)建音頻源節(jié)點
// 創(chuàng)建音頻分析器
analyser = audCon.createAnalyser()
// 快速傅里葉變換的長度必須為2的整數(shù)冪
analyser.fftSize = 512 // 這里把快速傅里葉變換的長度設(shè)置為512
// 連接音頻源節(jié)點到音頻分析器上
source.connect(analyser)
// 連接音頻分析器到音頻終端上
analyser.connect(audCon.destination)
// 創(chuàng)建數(shù)組,用于接收分析器節(jié)點的分析數(shù)據(jù)
// Uint8Array 數(shù)組類型表示一個 8 位無符號整型數(shù)組
// frequencyBinCount是fftSize值的一半作為可視化音頻的數(shù)組長度
dataArray = new Uint8Array(analyser.frequencyBinCount)
}
// 把分析出的波形繪制到canvas上
(function draw() {
// 動畫幀,按幀繪制canvas
requestAnimationFrame(draw)
// 清空畫布
const { width, height } = canvas
con.clearRect(0, 0, width, height)
// 讓分析器節(jié)點分析出數(shù)據(jù)到數(shù)組中
analyser.getByteFrequencyData(dataArray)
// 設(shè)置canvas上下文繪制的顏色
con.fillStyle = 'skyblue'
// len表示獲取分析到的音頻數(shù)據(jù)數(shù)組長度的
// 這里除以2.5是剔除不經(jīng)常出現(xiàn)的高頻的部分
const len = dataArray.length / 2.5
// barWidth表示每個波形矩形的寬度
// 這里除以2是為了繪制對稱的波形圖
const barWidth = width / len / 2
for (let i = 0; i < len; i++) {
// data是8位數(shù)組的每個數(shù)據(jù),因為是一個字節(jié),即data的值都是 <= 255
const data = dataArray[i]
// barHeight表示每個波形矩形的高度,值為單位長度乘canvas容器的高
const barHeight = (data / 255) * height
// 繪制點y
const y = height - barHeight
// 繪制點x1
const x1 = i * barWidth + width / 2
// 繪制點x2
const x2 = width / 2 - (i + 1) * barWidth
// 繪制右半部分波形圖
con.fillRect(x1, y, barWidth - 2, barHeight)
// 繪制左半部分波形圖
con.fillRect(x2, y, barWidth - 2, barHeight)
}
})()
</script>
</body>
</html>到此這篇關(guān)于JavaScript+Canvas實現(xiàn)繪制音頻可視化波形圖的文章就介紹到這了,更多相關(guān)JavaScript Canvas音頻波形圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript時間戳和日期字符串相互轉(zhuǎn)換代碼(超簡單)
下面小編就為大家?guī)硪黄猨avascript時間戳和日期字符串相互轉(zhuǎn)換代碼(超簡單)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
uniapp電商小程序?qū)崿F(xiàn)訂單30分鐘倒計時
這篇文章主要為大家詳細(xì)介紹了uniapp電商小程序?qū)崿F(xiàn)訂單30分鐘倒計時,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11
28個JavaScript常用字符串方法以及使用技巧總結(jié)
這篇文章主要給大家介紹了28個JavaScript常用字符串方法以及使用技巧的相關(guān)資料,文中統(tǒng)計的方法都非常實用,無論是日常工作還是面試,都建議多看一看,需要的朋友可以參考下2021-09-09

