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 相关文章推荐
Code: write(s,d) 输出连续字符串
Aug 19 Javascript
Jquery实现视频播放页面的关灯开灯效果
May 27 Javascript
javascript教程之不完整的继承(js原型链)
Jan 13 Javascript
javascript实现可全选、反选及删除表格的方法
May 15 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
Aug 20 Javascript
JS调用Android、Ios原生控件
Jan 06 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
Mar 15 Javascript
Vue底层实现原理总结
Feb 17 Javascript
vue页面加载闪烁问题的解决方法
Mar 28 Javascript
JS求Number类型数组中最大元素方法
Apr 08 Javascript
JQuery Ajax执行跨域请求数据的解决方案
Dec 10 jQuery
详解Node.JS模块 process
Aug 31 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
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
Vue 中mixin 的用法详解
2018/04/23 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
Python操作csv文件实例详解
2017/07/31 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
python实现多线程网页下载器
2018/04/15 Python
Django中使用Celery的方法示例
2018/11/29 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
浅析Python 序列化与反序列化
2020/08/05 Python
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
财务人员求职自荐书范文
2014/02/10 职场文书
合作意向协议书范本
2014/03/31 职场文书
学生请假条
2014/04/11 职场文书
在校实习生求职信
2014/06/18 职场文书
作风大整顿心得体会
2014/09/10 职场文书
群众路线个人整改措施
2014/10/24 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android