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 相关文章推荐
javascript引导程序
Oct 26 Javascript
jquery 合并内容相同的单元格(示例代码)
Dec 13 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 Javascript
使用js实现关闭js弹出层的窗口
Feb 10 Javascript
将中国标准时间转换成标准格式的代码
Mar 20 Javascript
Js Jquery创建一个弹出层可加载一个页面
May 08 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
Jun 26 Javascript
json传值以及ajax接收详解
May 24 Javascript
新手vue构建单页面应用实例代码
Sep 18 Javascript
解析vue中的$mount
Dec 21 Javascript
微信小程序三级联动选择器使用方法
May 19 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
PHP设计聊天室步步通
2006/10/09 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
JavaScript的类型简单说明
2010/09/03 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
浅谈React高阶组件
2018/03/28 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
浅谈Python type的使用
2019/11/19 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
台湾三立电视电商平台:电电购
2019/09/09 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
大学毕业通用个人的求职信
2013/12/08 职场文书
致短跑运动员广播稿
2014/01/09 职场文书
儿媳婚宴答谢词
2014/01/14 职场文书
HR求职自荐信范文
2014/06/21 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
go原生库的中bytes.Buffer用法
2021/04/25 Golang
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python
python脚本框架webpy模板赋值实现
2021/11/20 Python
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript