精品欧美一区二区三区在线观看 _久久久久国色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)

不卡视频一二三四| 欧美黄色大片网站| 欧美亚洲一区三区| 久久精品国产精品亚洲精品色| 国产老妇伦国产熟女老妇视频| 中文乱码免费一区二区三区下载| 亚洲精品91美女久久久久久久| 日韩免费高清在线| a天堂中文在线官网在线| 白白色 亚洲乱淫| 国产精品永久在线| 日本少妇久久久| 欧美3p视频| 亚洲精品国产欧美| 亚洲无在线观看| 91白丝在线| 欧美国产精品中文字幕| 狠狠色综合欧美激情| 亚洲午夜激情视频| 久久精品免费| 欧美激情视频免费观看| 午夜黄色福利视频| 西瓜成人精品人成网站| 日韩欧美国产综合| 日韩肉感妇bbwbbwbbw| 黄毛片在线观看| 亚洲乱码中文字幕| 亚洲欧美日韩在线综合| 青青视频在线观| 国产成人a级片| 91亚洲va在线va天堂va国| 久久久久亚洲视频| 午夜在线一区二区| 久久免费视频观看| 国产大片免费看| 国产精品国产三级国产在线观看| 亚洲欧美日韩图片| 国产又粗又猛又色| 91成人精品在线| 欧美一区二区成人6969| 一区二区三区四区毛片| 91国内外精品自在线播放| 日韩人在线观看| 激情综合在线观看| 国产网红女主播精品视频| 亚洲精品一二三四区| 一区二区三区观看| 欧美尤物美女在线| 国产精品日韩成人| 亚洲一区三区电影在线观看| www亚洲人| 国产精品每日更新| 杨幂一区欧美专区| 麻豆视频免费在线观看| 中文字幕在线不卡| 手机成人av在线| 黄色网在线免费看| 亚洲精品一卡二卡| 亚洲中文字幕无码一区二区三区| 国产黄色在线免费观看| 亚洲欧美一区二区三区极速播放| 综合国产精品久久久| 欧美黄色激情| 亚洲精品日韩一| 欧美高清中文字幕| 538在线视频| 欧美日韩亚洲一区二区| 欧美韩国日本在线| 欧美三区四区| 欧美日韩国产一级二级| 亚洲一二三av| 国偷自产av一区二区三区| 亚洲国产毛片完整版| 日韩一级视频在线观看| 国产一区二区三区91| 在线中文字幕日韩| 99久久婷婷国产综合| 好看的亚洲午夜视频在线| 97精品久久久| 日韩欧美国产另类| 精油按摩中文字幕久久| 成人18视频| 欧美在线观看在线观看| 国产欧美一区二区精品婷婷| 不卡中文字幕在线| 成人影音在线| 色婷婷精品久久二区二区蜜臂av| 天堂一区在线观看| 国产成人夜色高潮福利影视| 亚洲深夜福利视频| 亚洲欧美精品aaaaaa片| 亚洲黄页一区| 国产欧美日韩丝袜精品一区| 国产99对白在线播放| 91网站视频在线观看| 色一情一乱一伦一区二区三欧美| bestiality新另类大全| 欧美性xxxx极品hd欧美风情| 可以看污的网站| 久久精品论坛| 久久精品视频播放| 91video| 国产一区二区女| 久久偷窥视频| av文字幕在线观看| 色综合视频一区二区三区高清| 91女神在线观看| 天堂网av成人| 欧美另类极品videosbestfree| 超碰超碰超碰超碰| 国产成人在线观看免费网站| 日本亚洲导航| 成人三级小说| 欧美精品xxxxbbbb| 美女脱光内衣内裤| 国内精品久久久久久久影视蜜臀 | 欧美日韩亚洲免费| 性国产高清在线观看| 欧美午夜片在线看| 91精品人妻一区二区| 激情亚洲成人| 亚洲精品日产aⅴ| jizz在线观看| 日韩欧美精品网站| 娇妻高潮浓精白浆xxⅹ| 真实国产乱子伦精品一区二区三区| 日韩av成人在线观看| 色香蕉在线视频| 一区二区欧美视频| 色婷婷综合在线观看| 日韩精品网站| 国产精品国模在线| 色资源在线观看| 亚洲电影中文字幕在线观看| av在线网站免费观看| 日韩欧美综合| 国产伦精品一区二区三区精品视频| 深夜福利视频一区| 狠狠躁夜夜躁人人爽超碰91| www.黄色网| 激情av一区| 国产亚洲自拍偷拍| 白浆在线视频| 亚洲国产精品美女| 日韩成人在线免费视频| 成人精品亚洲人成在线| 免费人成自慰网站| 试看120秒一区二区三区| 欧美成人精品一区二区| 99视频国产精品免费观看a| 国产精品人人做人人爽人人添| 日韩欧美黄色大片| 成人嫩草影院| 91久久精品国产91性色| 国产精品一卡二卡三卡| 欧美一级精品在线| 国产亚洲精品av| youjizz国产精品| 久久国产乱子伦免费精品| 妖精视频一区二区三区| 日本精品久久久久久久| lutube成人福利在线观看| 欧美日精品一区视频| 五月婷婷综合激情网| 国产毛片一区二区| 国产va亚洲va在线va| 欧美日韩看看2015永久免费| 亲子乱一区二区三区电影 | 免费精品一区| 久久久久久久电影一区| 偷拍25位美女撒尿视频在线观看| 午夜精品久久一牛影视| 亚洲熟妇一区二区三区| 免费一级欧美片在线观看| 宅男一区二区三区| 成人性生交大片免费看96| 欧美孕妇毛茸茸xxxx| 啊v视频在线| 欧美一区二区三区在线观看| 日本在线观看视频网站| 久久精品人人做人人爽人人| 中文字幕1234区| 亚洲激情社区| 亚洲精品久久区二区三区蜜桃臀| 国产一区二区三区视频在线| 性视频1819p久久| av网站在线播放| 欧美成va人片在线观看| 日本中文字幕久久| 亚洲欧美精品午睡沙发| 好吊色视频一区二区三区| 日本伊人精品一区二区三区观看方式 | 欧美牲交a欧美牲交aⅴ免费下载| 日韩午夜电影网| 成人在线观看91| 国产精品成人国产| 久久久久久久91| 在线日本视频| 日韩精品在线视频美女| 99久久亚洲精品日本无码| 欧美日韩色婷婷| 欧美日韩午夜视频| 2014亚洲片线观看视频免费| 日日夜夜精品视频免费观看| 久久一二三四| 亚洲国产精品无码观看久久| 欧美va久久久噜噜噜久久| 久久狠狠久久综合桃花| 国产高清精品二区| 国产精品美女免费| 青青青免费在线视频| 欧美另类高清videos| 自拍视频在线| 亚洲天堂男人的天堂| 黄色av小说在线观看| 欧美精品丝袜中出| 日韩熟女一区二区| 五月天亚洲精品| 九九免费精品视频| 亚洲欧洲精品成人久久奇米网| wwwwww日本| 99v久久综合狠狠综合久久| 欧美高清精品一区二区| 久久精品国产99久久6| 色婷婷综合久久久久中文字幕| 9色精品在线| 免费人成自慰网站| 欧美三级第一页| 男人天堂成人网| 色偷偷综合网| 亚洲精品日韩精品| 国产一区二区三区91| 欧美久久在线| 日本欧美韩国国产| 久久99导航| 欧美91在线| 精品人伦一区二区三区| 国产精品高潮呻吟久久久久| 999在线观看免费大全电视剧| 国产午夜精品一区在线观看 | 国产精品一区二区免费在线观看| 欧美精品麻豆| 成人在线免费观看视频网站| 欧美另类专区| 亚洲色成人www永久在线观看| 欧美在线观看天堂一区二区三区| 丰满女人性猛交| 亚洲网色网站| 欧美 日韩 国产精品| 欧美特黄一级| 欧美视频免费看欧美视频| 亚洲三级毛片| 日本三级免费观看| 日本伊人色综合网| 国产成人美女视频| 国产黑丝在线一区二区三区| 国产在线观看免费播放| 成人白浆超碰人人人人| 亚洲av无码成人精品国产| 久久久精品国产免费观看同学| 法国空姐电影在线观看| 国产精品欧美一区二区三区| 天海翼在线视频| 夜夜精品视频一区二区| 日韩精品视频免费看| 精品美女永久免费视频| 懂色av中文字幕| 欧美猛男男办公室激情| 亚洲精品国产精品乱码不卡| 亚洲福利在线视频| 国产黄色片在线播放| 日韩天堂在线视频| 色帝国亚洲欧美在线| 51ⅴ精品国产91久久久久久| www.成人爱| 亚洲自拍偷拍第一页| 日本福利一区| 在线丝袜欧美日韩制服| 一区福利视频| 亚洲黄色a v| 国产98色在线|日韩| 中文字幕一区二区三区人妻| 国产精品毛片无遮挡高清| 久久久久人妻一区精品色欧美| 精品国产乱码久久久久久婷婷| 国产精品午夜一区二区| 91精品在线观看入口| 日批视频在线播放| 在线观看欧美日韩国产| 久草免费在线色站| 国产成人91久久精品| 久久综合给合| 青青草原亚洲| 国产一区亚洲| 亚洲黄色小视频在线观看| 成人在线综合网| 天堂av免费在线| 欧美日韩国产在线播放| 丰满熟女人妻一区二区三| 精品国产一区二区三区久久久蜜月 | 在线观看亚洲视频啊啊啊啊| 99国内精品| 婷婷激情小说网| 久久久国产一区二区三区四区小说| 唐朝av高清盛宴| 欧美优质美女网站| 色婷婷视频在线| 久久影院免费观看| 国产在线|日韩| 国产在线一区二区三区播放| 99久久久久久中文字幕一区| 欧美激情国产精品日韩| 国产+成+人+亚洲欧洲自线| av在线播放中文字幕| 精品成人av一区| 丰满人妻一区二区三区免费视频| 中文字幕精品久久| 韩国成人动漫| 精品久久久久久一区二区里番| 综合一区二区三区| 日韩爱爱小视频| 国产日产欧美一区二区视频| 国产香蕉视频在线| 精品av久久707| 在线免费观看污| 成人免费网站在线看| 精品免费视频| 宅男噜噜噜66国产免费观看| 97精品视频在线观看自产线路二| 麻豆国产尤物av尤物在线观看| 在线播放日韩导航| 日本中文字幕在线2020| 国产精品福利在线观看| 精品国产乱码久久久久久蜜坠欲下 | av色综合网| 一区二区电影| 91精品国产三级| 亚洲精品视频在线看| av中文字幕在线免费观看| 久久精品99久久久久久久久 | 欧美美女喷水视频| 午夜在线免费观看视频| 国产美女扒开尿口久久久| 久久人体视频| 中文字幕亚洲影院| 亚洲欧美日韩小说| av天堂一区二区三区| 欧美成人免费va影院高清| 蜜桃精品一区二区三区| 日韩黄色片在线| 成人听书哪个软件好| 国产精品成人国产乱| 亚洲国产中文字幕久久网| 深夜成人在线| 日韩高清在线播放| 理论片日本一区| 538精品在线观看| 欧美电影免费提供在线观看| 国产伦子伦对白在线播放观看| 蜜桃导航-精品导航| 老司机精品视频网站| 中文字幕黄色网址| 3d动漫精品啪啪一区二区竹菊| 最近中文字幕免费mv2018在线| www日韩av| 亚洲欧美日韩国产一区二区| 精品人伦一区二区| 欧美日韩成人在线| 9191在线播放| 精品网站在线看| 日韩电影在线免费| www.xxxx日本| 日韩精品视频观看| 国产一区精品福利| 国产小视频免费| 久久久久国产精品人| 亚洲图片视频小说| 久久久久成人网| 欧美人与牛zoz0性行为| 第一区免费在线观看| 午夜一区二区三区在线观看| 韩国中文字幕2020精品| 91久久久国产精品| 国产婷婷精品| 亚洲熟女少妇一区二区| 亚洲精品一区二区精华| 影音成人av| 你懂的av在线| 中文字幕一区二区三区不卡在线| 日韩中文字幕观看| 国产精品日韩一区| 亚洲第一网站| 91视频免费看片| 日韩久久精品成人| 久久久久久久久久久久电影| 国产精品免费观看久久| 亚洲免费视频中文字幕| 国内在线精品| 高清视频一区二区三区| 蜜桃传媒麻豆第一区在线观看|