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 css样式操作代码(批量操作)
Oct 09 Javascript
jQuery表单域选择器用法分析
Feb 10 Javascript
深入理解JavaScript 函数
Jun 06 Javascript
AngularJS 服务详细讲解及示例代码
Aug 17 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
Mar 04 Javascript
vue-resource 拦截器(interceptor)的使用详解
Jul 04 Javascript
详解用node搭建简单的静态资源管理器
Aug 09 Javascript
angular4自定义组件详解
Sep 28 Javascript
webpack多入口文件页面打包配置详解
Jan 09 Javascript
vuejs实现递归树型菜单组件
Jan 13 Javascript
jQuery实现异步上传一个或多个文件
Aug 17 jQuery
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
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 cli 方式 在crotab中运行解决
2010/02/08 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
PHP7 新增功能
2021/03/09 PHP
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
Python yield 使用方法浅析
2017/05/20 Python
学习python可以干什么
2019/02/26 Python
python实现ip代理池功能示例
2019/07/05 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
软件设计的目标是什么
2016/12/04 面试题
应届生妇产科护士求职信
2013/10/27 职场文书
迷你西餐厅创业计划书范文
2013/12/31 职场文书
2014年双拥工作总结
2014/11/21 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
小学教师教育随笔
2015/08/14 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python