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 分号引起的一段调试问题
Jun 18 Javascript
js 小贴士一星期合集
Apr 07 Javascript
被遗忘的javascript的slice() 方法
Apr 20 Javascript
使用JavaScript制作一个简单的计数器的方法
Jul 07 Javascript
js实现的二分查找算法实例
Jan 21 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
Nov 10 Javascript
node.js 中间件express-session使用详解
May 20 Javascript
vue.js 使用axios实现下载功能的示例
Mar 05 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
Jul 25 Javascript
解决vue v-for 遍历循环时key值报错的问题
Sep 06 Javascript
ES10 特性的完整指南小结
Mar 04 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
Mar 29 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中文件下载功能实现超详细流程分析
2012/06/13 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
人生苦短我用python python如何快速入门?
2018/03/12 Python
python 自动去除空行的实例
2018/07/24 Python
Selenium的使用详解
2018/10/19 Python
Python调用scp向服务器上传文件示例
2019/12/22 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
面向对象编程的优势是什么
2015/12/17 面试题
安全生产承诺书
2014/03/26 职场文书
幼儿园小班评语
2014/04/18 职场文书
学生评语大全
2014/04/18 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
给男朋友的道歉短信
2015/05/12 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
HTML中的表格元素介绍
2022/02/28 HTML / CSS
python获取字符串中的email
2022/03/31 Python