精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Web Audio API 太強(qiáng)了,讓我們一起領(lǐng)略音頻之美

開(kāi)發(fā) 架構(gòu)
Web Audio API 提供了一個(gè)非常高效和通用的系統(tǒng)來(lái)控制 Web 上的音頻,允許開(kāi)發(fā)人員為音頻添加特殊效果、可視化音頻、添加空間效果等等。Web Audio API 讓用戶能夠在音頻上下文(AudioContext)中進(jìn)行音頻操作,具有模塊化路由的特點(diǎn)。基本的音頻操作是在音頻節(jié)點(diǎn)上執(zhí)行的,這些節(jié)點(diǎn)連接在一起形成一個(gè)音頻路由圖。

?在瀏覽器中,我們通常使用 audio 標(biāo)簽來(lái)播放音頻:

<audio controls>
<source src="myAudio.mp3" type="audio/mpeg">
<source src="myAudio.ogg" type="audio/ogg">
</audio>

雖然 audio? 標(biāo)簽使用起來(lái)很簡(jiǎn)單,但也存在一些局限。比如它只控制音頻的播放、暫停、音量等。如果我們想進(jìn)一步控制音頻,比如通道合并和拆分、混響、音高和音頻幅度壓縮等。那么僅僅使用 audio 標(biāo)簽是做不到的。為了解決這個(gè)問(wèn)題,我們需要使用 Web Audio API。

Web Audio API 提供了一個(gè)非常高效和通用的系統(tǒng)來(lái)控制 Web 上的音頻,允許開(kāi)發(fā)人員為音頻添加特殊效果、可視化音頻、添加空間效果等等。Web Audio API 讓用戶能夠在音頻上下文(AudioContext)中進(jìn)行音頻操作,具有模塊化路由的特點(diǎn)。基本的音頻操作是在音頻節(jié)點(diǎn)上執(zhí)行的,這些節(jié)點(diǎn)連接在一起形成一個(gè)音頻路由圖。

接下來(lái),我將演示如何利用 AudioContext 對(duì)象來(lái)播放音頻:

<!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>Audio Context</title>
</head>
<body>
<input id="audioFile" type="file" accept="audio/*"/>
<script>
const inputFile = document.querySelector("#audioFile");
inputFile.onchange = function(event) {
const file = event.target.files[0];
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = evt {
const encodedBuffer = evt.currentTarget.result;
const context = new AudioContext();
context.decodeAudioData(encodedBuffer, decodedBuffer => {
const dataSource = context.createBufferSource();
dataSource.buffer = decodedBuffer;
dataSource.connect(context.destination);
dataSource.start();
})
}
}
</script>
</body>
</html>

在以上代碼中,我們使用 FileReader? API 來(lái)讀取音頻文件的數(shù)據(jù)。然后創(chuàng)建一個(gè) AudioContext? 對(duì)象并使用該對(duì)象上的 decodeAudioData? 方法解碼音頻。獲取到解碼后的數(shù)據(jù)后,我們會(huì)繼續(xù)創(chuàng)建一個(gè) AudioBufferSourceNode? 對(duì)象來(lái)存儲(chǔ)解碼后的音頻數(shù)據(jù),然后將 AudioBufferSourceNode? 對(duì)象與 context.destination? 對(duì)象連接起來(lái),最后調(diào)用 start 方法播放音頻。

看到這里,是不是覺(jué)得使用 AudioContext? 播放音頻文件很麻煩?實(shí)際上它非常強(qiáng)大。下面我將介紹如何使用 AudioContext、AnalyserNode、Canvas 來(lái)實(shí)現(xiàn)音頻可視化的功能。

可視化音頻文件主要分為以下 3 個(gè)步驟:

  • 獲取音頻文件數(shù)據(jù);
  • 獲取音頻文件頻率數(shù)據(jù);
  • 使用 Canvas API 實(shí)現(xiàn)數(shù)據(jù)可視化。

1、獲取音頻文件數(shù)據(jù)

在以下的代碼中,我們使用 FileReader? API 來(lái)讀取音頻文件的數(shù)據(jù)。然后創(chuàng)建一個(gè) AudioContext? 對(duì)象并使用該對(duì)象上的 decodeAudioData 方法解碼音頻。當(dāng)然,你也可以從網(wǎng)絡(luò)上下載音頻文件。

inputFile.onchange = function(event) {
const file = event.target.files[0];
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = evt=>{
const encodedBuffer = evt.currentTarget.result;
const context = new AudioContext();
context.decodeAudioData(encodedBuffer, decodedBuffer=>{
const dataSource = context.createBufferSource();
dataSource.buffer = decodedBuffer;
analyser = createAnalyser(context, dataSource);
bufferLength = analyser.frequencyBinCount;
frequencyData = new Uint8Array(bufferLength);
dataSource.start();
drawBar();
}
)
}

2、獲取音頻文件頻率數(shù)據(jù)

要獲取頻率數(shù)據(jù),我們需要利用 AnalyserNode 接口,該接口提供實(shí)時(shí)頻率和時(shí)域分析信息。

const analyser = audioCtx.createAnalyser();
analyser.fftSize = 512;
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
analyser.getByteFrequencyData(dataArray);

AnalyserNode 對(duì)象上的 getByteFrequencyData()? 方法會(huì)將當(dāng)前頻率數(shù)據(jù)復(fù)制到傳入的 Uint8Array 對(duì)象。

3、使用 Canvas API 實(shí)現(xiàn)數(shù)據(jù)可視化

獲取頻率數(shù)據(jù)后,我們就可以使用 Canvas API 實(shí)現(xiàn)數(shù)據(jù)可視化,比如使用 CanvasRenderingContext2D 接口中的 fillRect 方法,對(duì)數(shù)據(jù)進(jìn)行可視化。

function drawBar() {
requestAnimationFrame(drawBar);
analyser.getByteFrequencyData(frequencyData);
canvasContext.clearRect(0, 0, canvasWidth, canvasHeight);
let barHeight, barWidth, r, g, b;
for (let i = 0, x = 0; i < bufferLength; i++) {
barHeight = frequencyData[i];
barWidth = canvasWidth / bufferLength * 2;
r = barHeight + 25 * (i / bufferLength);
g = 250 * (i / bufferLength);
b = 50;
canvasContext.fillStyle = "rgb(" + r + "," + g + "," + b + ")";
canvasContext.fillRect(x, canvasHeight - barHeight, barWidth, barHeight);
x += barWidth + 2;
}
}

分析完上面的處理流程,我們來(lái)看一下完整的代碼:

<!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>Visualizations with Web Audio API</title>
</head>
<body>
<input id="audioFile" type="file" accept="audio/*"/>
<canvas id="canvas"></canvas>
<script>
const canvas = document.querySelector("#canvas");
const inputFile = document.querySelector("#audioFile");

const canvasWidth = window.innerWidth;
const canvasHeight = window.innerHeight;
const canvasContext = canvas.getContext("2d");
canvas.width = canvasWidth;
canvas.height = canvasHeight;
let frequencyData = [], bufferLength = 0, analyser;

inputFile.onchange = function(event) {
const file = event.target.files[0];

const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = evt=>{
const encodedBuffer = evt.currentTarget.result;
const context = new AudioContext();
context.decodeAudioData(encodedBuffer, decodedBuffer=>{
const dataSource = context.createBufferSource();
dataSource.buffer = decodedBuffer;
analyser = createAnalyser(context, dataSource);
bufferLength = analyser.frequencyBinCount;
frequencyData = new Uint8Array(bufferLength);
dataSource.start();
drawBar();
}
)
}

function createAnalyser(context, dataSource) {
const analyser = context.createAnalyser();
analyser.fftSize = 512;
dataSource.connect(analyser);
analyser.connect(context.destination);
return analyser;
}

function drawBar() {
requestAnimationFrame(drawBar);
analyser.getByteFrequencyData(frequencyData);
canvasContext.clearRect(0, 0, canvasWidth, canvasHeight);
let barHeight, barWidth, r, g, b;
for (let i = 0, x = 0; i < bufferLength; i++) {
barHeight = frequencyData[i];
barWidth = canvasWidth / bufferLength * 2;
r = barHeight + 25 * (i / bufferLength);
g = 250 * (i / bufferLength);
b = 50;
canvasContext.fillStyle = "rgb(" + r + "," + g + "," + b + ")";
canvasContext.fillRect(x, canvasHeight - barHeight, barWidth, barHeight);
x += barWidth + 2;
}
}
}
</script>
</body>
</html>

瀏覽器打開(kāi)包含上述代碼的網(wǎng)頁(yè),然后選擇一個(gè)音頻文件后,你就可以看到類似的圖形。

圖片

事實(shí)上,我們有了頻率數(shù)據(jù)之后,我們還可以使用 Canvas API 繪制其他漂亮的圖形。

圖片

圖片

以上圖形是使用 Github 上的第三方庫(kù) vudio.js 生成的。

https://github.com/alex2wong/vudio.js

責(zé)任編輯:武曉燕 來(lái)源: 全棧修仙之路
相關(guān)推薦

2021-08-27 07:06:10

IOJava抽象

2021-12-29 08:27:05

ByteBuffer磁盤(pán)服務(wù)器

2022-03-08 17:52:58

TCP格式IP

2022-03-31 18:59:43

數(shù)據(jù)庫(kù)InnoDBMySQL

2022-02-14 10:16:22

Axios接口HTTP

2022-06-26 09:40:55

Django框架服務(wù)

2022-02-14 07:03:31

網(wǎng)站安全MFA

2016-09-06 10:39:30

Dell Techno

2021-11-26 07:00:05

反轉(zhuǎn)整數(shù)數(shù)字

2021-07-15 07:23:28

Singlefligh設(shè)計(jì)

2021-11-29 07:24:08

ACID事務(wù)大數(shù)據(jù)

2023-08-14 08:38:26

反射reflect結(jié)構(gòu)體

2021-12-16 12:01:21

區(qū)塊鏈Libra貨幣

2021-07-31 11:40:55

Openresty開(kāi)源

2012-04-14 20:47:45

Android

2023-08-02 08:35:54

文件操作數(shù)據(jù)源

2022-07-10 23:15:46

Go語(yǔ)言內(nèi)存

2022-08-01 07:57:03

數(shù)組操作內(nèi)存

2022-05-24 08:21:16

數(shù)據(jù)安全API

2021-02-23 09:21:29

代碼效率C++
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久久99精品视频| 国产经典一区二区| 乱码一区二区三区| 日本不卡网站| 久久久精品免费观看| 9999国产精品| 日韩欧美亚洲一二三区| 日本一区二区精品| 国产丰满美女做爰| 久久久久国产精品一区三寸| 中文字幕欧美日韩精品| 国产无套精品一区二区三区| 综合日韩av| 亚洲欧美激情视频在线观看一区二区三区 | 国产精品视频大全| 久久久精品99| 成人在线免费观看视频| 精品国产a毛片| 天天视频天天爽| 国产色播av在线| 国产午夜精品久久久久久久| 99国产超薄肉色丝袜交足的后果| 91video| 国产一区日韩一区| 中文字幕亚洲综合久久筱田步美| 欧美熟妇精品一区二区蜜桃视频| 日本综合视频| 黑人巨大精品欧美一区免费视频| 欧洲美女和动交zoz0z| 毛片在线播放网站| 蜜桃在线一区二区| 999国产精品| 亚洲深夜福利网站| 成人午夜精品无码区| 91精品国产色综合久久不卡粉嫩| 色诱亚洲精品久久久久久| 黄色三级中文字幕| 国产黄色在线观看| 国产精品第五页| 日本亚洲导航| 你懂的在线网址| 97精品超碰一区二区三区| 亚洲在线第一页| 在线视频欧美亚洲| 日韩成人一级大片| 日韩av色综合| 欧美黑人一区二区| 99久久999| 国产精品毛片在线| 欧美大荫蒂xxx| 夫妻性生活毛片| 欧美大片aaaa| 日韩中文理论片| 国精产品一区一区| 国产精品久久久久久| 一个色综合导航| 欧美激情亚洲色图| jvid福利在线一区二区| 亚洲色图欧美制服丝袜另类第一页| 久久久午夜精品福利内容| 伊人久久噜噜噜躁狠狠躁| 欧美一区二区精品久久911| 激情黄色小视频| 亚洲欧洲日韩精品在线| 在线成人av影院| 亚洲国产综合av| 无人区乱码一区二区三区| 欧美一区二区三区免费大片| 蜜桃视频无码区在线观看| 日本一区二区乱| 日韩精品一区二区三区蜜臀 | 黄色精品视频| 在线观看日韩高清av| 国产精品无码一本二本三本色| 在线观看爽视频| 欧美中文字幕不卡| 一二三级黄色片| 亚洲精品观看| 日韩av在线导航| 久久精品—区二区三区舞蹈| 九九久久婷婷| 日韩有码在线观看| 久久久精品人妻一区二区三区四| 伊人成人在线视频| 国产91久久婷婷一区二区| 一区二区视频在线免费观看| 国产伦精品一区二区三区视频青涩 | 成人亚洲综合| 欧美另类变人与禽xxxxx| 欧美体内she精高潮| 18国产精品| 亚洲人高潮女人毛茸茸| 亚洲人做受高潮| 在线看片一区| 国产精品一区二区性色av| av天堂一区二区三区| 97精品久久久久中文字幕| 亚洲欧美日韩另类精品一区二区三区| av网站网址在线观看| 天天综合网 天天综合色| 日韩大片一区二区| 久久久亚洲欧洲日产| 一区二区成人精品| 精品无码m3u8在线观看| 日本欧美久久久久免费播放网| 成人综合网网址| 深夜福利视频在线免费观看| 久久婷婷久久一区二区三区| 麻豆中文字幕在线观看| 无码小电影在线观看网站免费| 欧美性生活久久| 免费看黄色片的网站| 成人影院天天5g天天爽无毒影院| 欧美黑人xxxx| 伊人久久国产精品| 91视频.com| 激情六月天婷婷| 91福利精品在线观看| 亚洲国产欧美一区二区丝袜黑人| 开心激情五月网| 另类av一区二区| 高清不卡一区二区三区| 免费在线看a| 色噜噜狠狠色综合欧洲selulu| 一个色综合久久| 欧美日韩老妇| 茄子视频成人在线| 空姐吹箫视频大全| 一区二区久久久| 污污视频网站在线| 欧美在线色图| 国产成人综合亚洲| 青青青草原在线| 五月天亚洲精品| 香蕉久久久久久av成人| 91成人看片| 成人在线观看视频网站| 国产h在线观看| 色婷婷精品久久二区二区蜜臂av | 国内揄拍国内精品少妇国语| av av片在线看| 亚洲女人****多毛耸耸8| 亚洲综合婷婷久久| 精品一区二区三| 国产精品久久久久久搜索| 欧美成熟毛茸茸| 色婷婷精品大在线视频| 国产熟妇久久777777| 另类图片国产| 四虎永久国产精品| 成人做爰视频www| 一区二区福利视频| 中文av免费观看| 国产精品色噜噜| 在线观看免费av网址| 色777狠狠狠综合伊人| 国产日韩换脸av一区在线观看| 成人在线视频成人| 欧美欧美午夜aⅴ在线观看| 天天操天天干天天操天天干| 免费一级欧美片在线观看| 日韩免费三级| 一级欧美视频| 色综合老司机第九色激情| 国产黄色大片网站| 亚洲第一av色| 无码熟妇人妻av| 丝袜美腿亚洲一区二区图片| 色综合电影网| 24小时成人在线视频| 欧美精品在线免费观看| 丰满人妻妇伦又伦精品国产| 午夜精品福利在线| 91国模少妇一区二区三区| 日本va欧美va欧美va精品| 一区精品视频| 亚洲一区二区三区在线免费| 91精品国产乱码久久久久久久久 | 亚洲精品a区| 欧美在线性爱视频 | 欧美国产日韩精品免费观看| 欧美日韩中文不卡| 国产一区清纯| 欧洲精品国产| 国产美女视频一区二区| 久久久久久尹人网香蕉| 欧美777四色影视在线| 欧美日韩高清影院| 国产午夜精品一区二区理论影院| 91日韩在线专区| 亚洲小视频网站| 日韩亚洲国产精品| 亚洲欧美一区二区原创| gogo久久日韩裸体艺术| 国产ts一区二区| 菠萝菠萝蜜在线视频免费观看 | 国产极品一区二区| 免费成人小视频| 国产日韩欧美精品在线观看| 欧美偷拍综合| 国产精品成人观看视频免费| 欧美成人精品三级网站| 欧美激情精品久久久久久免费印度| 亚洲色大成网站www| 欧美视频完全免费看| 欧美黄色免费在线观看| 国产欧美一区二区三区鸳鸯浴| 在线观看网站黄| 日韩国产精品91| 日韩五码在线观看| 91日韩免费| 热舞福利精品大尺度视频| 免费观看在线一区二区三区| 国产v综合ⅴ日韩v欧美大片| 色婷婷视频在线观看| 中文字幕亚洲欧美在线| 日本免费一区视频| 日韩视频免费观看高清完整版 | 三上悠亚一区二区| 久久久久久久国产精品| 欧美成人性生活视频| 日韩精品视频三区| 刘亦菲毛片一区二区三区| 欧美日产在线观看| 国产成人精品一区二区色戒| 婷婷综合在线观看| 国产精品第108页| 一区二区三区四区视频精品免费| 毛片久久久久久| 久久久91精品国产一区二区精品 | 红杏aⅴ成人免费视频| 成人写真福利网| 国产原创一区| 国产精品久久不能| 日韩成人亚洲| 国产99久久精品一区二区| 99re6在线精品视频免费播放| 美女啪啪无遮挡免费久久网站| eeuss影院www在线播放| 亚洲人成欧美中文字幕| 手机福利小视频在线播放| 亚洲黄色有码视频| 欧美性受xxxx狂喷水| 精品国产sm最大网站| 好男人www在线视频| 欧美xxxxxxxx| 好吊色在线观看| 日韩电视剧在线观看免费网站| 国产成人无码www免费视频播放| 日韩欧美自拍偷拍| 亚洲国产综合一区| 欧美v日韩v国产v| 黄色福利在线观看| 亚洲级视频在线观看免费1级| 黄色一级大片在线免费看国产一| 精品少妇一区二区三区| 亚洲欧美另类视频| 日韩精品免费观看| 精品美女视频在线观看免费软件| 亚洲欧美一区二区三区四区| 国产中文字幕在线看| 在线电影av不卡网址| 最新国产在线观看| 久久天天躁狠狠躁夜夜av| 日韩精品卡一| 性色av一区二区三区红粉影视| 一个人www视频在线免费观看| 日本国产一区二区三区| 国产一区二区三区朝在线观看| 国产精品入口日韩视频大尺度| 亚洲伦理一区二区| 国产一区二区不卡视频| 亚洲人和日本人hd| 一区二区三区在线观看www| 在线成人超碰| 日韩 欧美 视频| 美女视频一区免费观看| 亚欧激情乱码久久久久久久久| 国产高清视频一区| 一出一进一爽一粗一大视频| 国产亚洲欧美色| 熟女av一区二区| 午夜欧美在线一二页| 国产精品久久久久久人| 7777精品伊人久久久大香线蕉| 亚洲av无码一区二区乱子伦| 亚洲精品电影网在线观看| 波多野结衣在线网站| 欧美成人精品一区| 成人性生交大片免费观看网站| 国产精品一二区| 91蜜桃臀久久一区二区| 日韩av图片| 红桃视频欧美| 日本www.色| 丁香婷婷深情五月亚洲| 人妻少妇无码精品视频区| 亚洲免费观看高清| 无码人妻av一区二区三区波多野 | 红桃av永久久久| 亚洲熟妇无码久久精品| 亚洲第一页自拍| 生活片a∨在线观看| 97色在线观看| 最新亚洲国产| 欧美日韩一区综合| 韩日精品视频| 可以在线看的黄色网址| 国产福利不卡视频| 91麻豆制片厂| 欧美视频在线看| www.色亚洲| 日韩视频欧美视频| 成人性生交大片免费网站| 国产精品美女诱惑| 久久久久久久久久久妇女 | 怡红院成人在线| 国产精品成人观看视频免费| 天天做天天爱综合| 久久99999| 久久综合色播五月| 久久精品国产亚洲av麻豆色欲 | 91免费视频污| 中文字幕免费观看一区| www.伊人久久| 亚洲第一中文字幕| 日本在线视频中文有码| 国产日韩在线视频| 欧美精品一区二区久久| 男人天堂999| av在线不卡网| 国产污视频在线观看| 日韩欧美电影在线| 在线视频中文字幕第一页| 成人欧美一区二区三区在线| 精品国产一区二区三区av片| 六月激情综合网| 不卡视频在线观看| 日本少妇久久久| 亚洲精品一区二区在线观看| 日韩免费影院| 国产二区不卡| 亚洲国内自拍| 欲求不满的岳中文字幕| 五月天中文字幕一区二区| 黄色av小说在线观看| 欧美激情精品久久久久久久变态| 亚洲精品18| 男人日女人视频网站| 99r国产精品| 伊人手机在线视频| 亚洲欧美国产精品va在线观看| 樱花草涩涩www在线播放| 久久久久久草| 日韩国产欧美一区二区三区| 日韩一级av毛片| 欧美午夜精品久久久久久超碰 | 国产精品精品国产色婷婷| 中文字幕+乱码+中文| 俺去了亚洲欧美日韩| 日韩毛片免费看| 男人天堂成人网| 成人黄色大片在线观看 | 精品国产成人亚洲午夜福利| 欧美性极品xxxx做受| 国产永久免费高清在线观看视频| 国产精品久久激情| 亚洲精品tv久久久久久久久久| 三日本三级少妇三级99| 亚洲一区视频在线观看视频| 神马久久久久久久久久| 欧美又大又硬又粗bbbbb| 欧美亚洲高清| 在线a免费观看| 午夜欧美视频在线观看| 波多野结衣在线影院| 亚洲xxxxx性| 国产欧美成人| 国产又粗又猛又爽又黄的视频小说| 欧美久久久一区| bl视频在线免费观看| 清纯唯美一区二区三区| 国内精品久久久久影院色| 日本熟妇成熟毛茸茸| 亚洲日韩中文字幕| 精品精品视频| 天天摸天天碰天天添| 中文字幕一区免费在线观看| 亚洲精品国产av| 国产成人精品av| 欧美日韩国产高清| 欧美做受高潮6| 日韩免费高清av| 99久久久国产精品免费调教网站| 粉嫩av一区二区三区天美传媒| 久久这里只有精品6| 国产精品伦理一区| 欧洲永久精品大片ww免费漫画| 国产精品国产三级国产在线观看| 国产精品无码在线|