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 相关文章推荐
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
jqGrid读取选择的多行的某个属性代码
May 18 Javascript
jQuery简单实现禁用右键菜单
Mar 10 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
Aug 21 Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 Javascript
Javascript字符串拼接小技巧(推荐)
Jun 02 Javascript
JavaScript面向对象分层思维全面解析
Nov 22 Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 Javascript
vuex的简单使用教程
Feb 02 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
Oct 23 Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 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实现utf-8转unicode函数分享
2015/01/06 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
JS截取字符串常用方法详细整理
2013/10/28 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
python导入时小括号大作用
2017/01/10 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
Python对多属性的重复数据去重实例
2018/04/18 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
flask 实现token机制的示例代码
2019/11/07 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
后勤人员自我鉴定
2013/10/20 职场文书
计算机专业大学生的自我评价
2013/11/14 职场文书
物流专员岗位职责
2014/02/17 职场文书
人大调研汇报材料
2014/08/14 职场文书
师德师风自查总结
2014/10/14 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
大学军训口号大全
2015/12/24 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python