AudioContext 实现音频可视化(web技术分享)


Posted in Javascript onFebruary 24, 2022

要实现音频可视化,实现一些炫酷的效果需要借助 Web Audio API提供的一些方法 AudioContext:

  • AudioContext接口表示由链接在一起的音频模块构建的音频处理图,每个模块由一个AudioNode表示。音频上下文控制它包含的节点的创建和音频处理或解码的执行。
  • 在做任何其他操作之前,您需要创建一个AudioContext对象,因为所有事情都是在上下文中发生的。建议创建一个AudioContext对象并复用它,而不是每次初始化一个新的AudioContext对象,并且可以对多个不同的音频源和管道同时使用一个AudioContext对象。

一、准备 audio 和 canvas 标签

<audio class="audio" ref='audio' :src='tune' @ended='ended'></audio>

<canvas ref='canvas' width='300px' height='300px'></canvas>

二、创建并返回一个新的AudioContext对象。

const ctx = new AudioContext();

三、创建一个新的MediaElementAudioSourceNode对象

  • AudioContext 接口的 createMediaElementSource() 方法用于创建一个新的 MediaElementAudioSourceNode对象,输入某个存在的 HTML<audio>or<video>` 元素, 对应的音频即可被播放或者修改.
const audioSrc = ctx.createMediaElementSource(this.audioElement);

四、创建AnalyserNode对象

AudioContext createAnalyser()方法能创建一个AnalyserNode,可以用来获取音频时间和频率数据,以及实现数据可视化。

const analyser = ctx.createAnalyser();

五、设置 fftSize 属性

  • AnalyserNode 接口的 fftSize 属性的值是一个无符号长整型的值, 表示(信号)样本的窗口大小。当执行快速傅里叶变换(Fast Fourier Transfor (FFT))时,这些(信号)样本被用来获取频域数据。
  • fftSize 属性的值必须是从32到32768范围内的2的非零幂; 其默认值为2048。
analyser.fftSize = 512;

六、audioSrc 和 analyser 进行链接

AudioNode 接口的 connect() 方法使你能将一个节点的输出连接到一个指定目标,这个指定的目标可能是另一个 AudioNode(从而将音频数据引导到下一个指定节点)或一个AudioParam, 以便上一个节点的输出数据随着时间流逝能自动地对下一个参数值进行改变。

audioSrc.connect(analyser);

七、analyser 和 ctx.destination 进行链接

AudioContext destination 属性返回一个 AudioDestinationNode 表示context中所有音频(节点)的最终目标节点,一般是音频渲染设备,比如扬声器。

analyser.connect(ctx.destination)

八、歌曲播放进行中

Uint8Array 数组类型表示一个8位无符号整型数组,创建时内容被初始化为0。创建完后,可以以对象的方式或使用数组下标索引的方式引用数组中的元素。

AnalyserNode接口的 getByteFrequencyData() 方法将当前频率数据复制到传入的Uint8Array(无符号字节数组)中。

如果数组的长度小于 AnalyserNode.frequencyBinCount, 那么Analyser多出的元素会被删除. 如果是大于, 那么数组多余的元素会被忽略.

visualization() {

    const arr = new Uint8Array(this.analyser.frequencyBinCount);

    this.analyser.getByteFrequencyData(arr);

    this.draw(arr);

},

九、使用canvas绘制音频图谱

  • HTMLCanvasElement.getContext() 方法返回 canvas 的上下文,如果上下文没有定义则返回  null .
  • 2d建立一个 CanvasRenderingContext2D 二维渲染上下文。
this.canvas = this.$refs.canvas.getContext('2d');draw(arr) {    canvas.clearRect(0, 0, document.body.clientWidth, this.canvasHeight);    const start = ((document.body.clientWidth / 2) - ((arr.length / 2) * 3));    arr.forEach((item, index) => {        this.canvas.beginPath();        this.canvas.strokeStyle = '#B2AFF4';        this.canvas.lineWidth = 3;        this.canvas.moveTo(start + (index * 4), this.canvasHeight);        this.canvas.lineTo(start + (index * 4), this.canvasHeight - item / 2);        this.canvas.stroke();    });}

效果展示:

 AudioContext 实现音频可视化(web技术分享)

到此这篇关于 AudioContext 实现音频可视化(web技术分享)的文章就介绍到这了,更多相关 AudioContext 实现音频可视化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
Javascript 相关文章推荐
JS的IE和Firefox兼容性集锦
Dec 11 Javascript
javascript五图轮播切换实用版
Aug 17 Javascript
js获取当前路径的简单示例代码
Jan 08 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
Apr 24 Javascript
javascript实现判断鼠标的状态
Jul 10 Javascript
jQuery中通过ajax的get()函数读取页面的方法
Feb 29 Javascript
简单实现Vue的observer和watcher
Dec 21 Javascript
详解Vue使用命令行搭建单页面应用
May 24 Javascript
jQuery plugin animsition使用小结
Sep 14 jQuery
详解nuxt sass全局变量(公共scss解决方案)
Jun 27 Javascript
vue中element 的upload组件发送请求给后端操作
Sep 07 Javascript
原生JavaScript实现五子棋游戏
Nov 09 Javascript
WebRTC记录音视频流(web技术分享)
Feb 24 #Javascript
Vue3如何理解ref toRef和toRefs的区别
Feb 18 #Vue.js
JavaScript实现酷炫的鼠标拖尾特效
Vue h函数的使用详解
Feb 18 #Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 #Vue.js
详解JSON.parse和JSON.stringify用法
Feb 18 #Javascript
前端vue+express实现文件的上传下载示例
You might like
3种平台下安装php4经验点滴
2006/10/09 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
编程语言Python的发展史
2014/09/26 Python
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
职业生涯规划怎么写
2013/12/29 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
初中学生期末评语
2014/04/24 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
慈善晚会策划方案
2014/05/14 职场文书
个人先进材料范文
2014/12/30 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
禁毒主题班会教案
2015/08/14 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
六年级语文教学反思
2016/03/03 职场文书