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构造函数、索引数组和属性的实现方式和使用
Nov 16 Javascript
node.js中的console.log方法使用说明
Dec 09 Javascript
js实现DOM走马灯特效的方法
Jan 21 Javascript
karma+webpack搭建vue单元测试环境的方法示例
May 24 Javascript
详解node.js的http模块实例演示
Jul 12 Javascript
浅谈webpack SplitChunksPlugin实用指南
Sep 17 Javascript
vue页面切换过渡transition效果
Oct 08 Javascript
微信小程序实现商品属性联动选择
Feb 15 Javascript
实现高性能javascript的注意事项
May 27 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
Apr 03 Javascript
VUE项目axios请求头更改Content-Type操作
Jul 24 Javascript
nestjs返回给前端数据格式的封装实现
Feb 22 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 Mysql编程之高级技巧
2008/08/27 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
CentOS安装php v8js教程
2015/02/26 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
清空上传控件input file的值
2010/07/03 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
五段实用的js高级技巧
2011/12/20 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
js document.write()使用介绍
2014/02/21 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
整理Python中的赋值运算符
2015/05/13 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
美国存储和组织商店:The Container Store
2017/08/16 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
大学校庆邀请函
2014/01/11 职场文书
四下基层实施方案
2014/03/28 职场文书
创建青年文明号材料
2014/05/09 职场文书
幼儿园课题方案
2014/06/09 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android