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 在定义的时候立即执行的函数表达式(function)写法
Jan 16 Javascript
JavaScript动态创建div属性和样式示例代码
Oct 09 Javascript
浅谈JavaScript 框架分类
Nov 10 Javascript
javascript数组输出的两种方式
Jan 13 Javascript
jquery中添加属性和删除属性
Jun 03 Javascript
再JavaScript的jQuery库中编写动画效果的指南
Aug 13 Javascript
JavaScript跨域调用基于JSON的RESTful API
Jul 09 Javascript
jQuery.datatables.js插件用法及api实例详解
Oct 28 Javascript
JavaScript编写九九乘法表(两种任选)
Feb 04 Javascript
基于js中document.cookie全面解析
Sep 14 Javascript
Bootstrap table表格初始化表格数据的方法
Jul 25 Javascript
JS数据类型STRING使用实例解析
Dec 18 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实现数据分页显示功能
2016/05/26 PHP
简单实现php上传文件功能
2017/09/21 PHP
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
Python数组定义方法
2016/04/13 Python
用Python解决计数原理问题的方法
2016/08/04 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
python logging日志模块原理及操作解析
2019/10/12 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
Foreo国际站:Foreo International
2018/10/29 全球购物
2014年机关植树节活动方案
2014/02/27 职场文书
生日宴会策划方案
2014/06/03 职场文书
视光学专业自荐信
2014/06/24 职场文书
绿色小区申报材料
2014/08/22 职场文书
幼儿园八一建军节活动方案
2014/08/27 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
MySQL数据库必备之条件查询语句
2021/10/15 MySQL
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL