web技术分享|AudioContext 实现音频可视化
connygpt 2024-12-27 16:05 3 浏览
要实现音频可视化,实现一些炫酷的效果需要借助 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();
});
}
效果展示
相关推荐
- vue3 组件初始化流程
-
学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)import{h,ref}...
- Context的典型使用场景
-
获取应用文件路径基类Context提供了获取应用文件路径的能力,ApplicationContext、AbilityStageContext、UIAbilityContext和ExtensionCon...
- web技术分享|AudioContext 实现音频可视化
-
要实现音频可视化,实现一些炫酷的效果需要借助WebAudioAPI提供的一些方法AudioContext。AudioContext接口表示由链接在一起的音频模块构建的音频处理图,每个模块由一个...
- 2023-03-21:音视频解混合(demuxer)为MP3和H264,用go语言编写
-
2023-03-21:音视频解混合(demuxer)为MP3和H264,用go语言编写。答案2023-03-21:#步骤1:安装github.com/moonfdd/ffmpeg-gogoget...
- 如何在微信小程序中加入音频或视频?
-
要在微信小程序中加入音频或视频,可以使用以下步骤:1.在小程序页面中引入wx.createInnerAudioContext()或wx.createVideoContext()方法。2.创建音频或...
- 使用RKE的方式快速部署K8S集群
-
RKE是一款经过CNCF认证的开源Kubernetes发行版,可以在Docker容器内运行。它通过删除大部分主机依赖项,并为部署、升级和回滚、节点扩容提供一个稳定的路径,从而解决了Kubernetes...
- Rancher(k8s)的持久存储卷Volumes(PV/PVC)的使用方法
-
1.介绍1.1介绍在上一节课里面福哥带着大家学会了使用k8s的负载均衡LoadBalancing(LB)发布集群内部的服务的方法,今天我们要讲讲k8s的持久存储卷Volumes(PVC)的使用方...
- 基于 Sealos 的镜像构建能力,快速部署自定义 k8s 集群
-
Sealos是一个快速构建高可用k8s集群的命令行工具,该工具部署时会在第一个k8smaster节点部署registry服务(sealos.hub),该域名通过hosts解析到第一...
- Docker、Containerd、RunC分别是什么
-
什么是RunC上一遍文章《真正运行容器的工具:深入了解runc和OCI规范》已经讲清楚了Runc与OCI。这里再讲解一下概念。Docker、Google、CoreOS和其他供应商创建了开放容...
- 偷偷爆料下Docker学习,看这一篇就够了!十分推荐!!
-
一.什么是容器?生活中常将一个能用来承载物料的装置称之为容器,比如碗、盘子,杯子等,容器内可放入各种各样的物料,每一个容器都相互独立,不相互干扰。而我们计算机领域所说的容器通常是指一个包含了完整的运...
- Docker网络优化方案,你认为哪种将引爆未来?
-
ICT架构师技术交流微信号分析和交流ICT行业最前沿技术,分享更多存储、服务器、数据中心、网络、软件定义和虚拟化等相关知识,旨在知识交流、开放共享和共同进步。上一篇文章Docker原生网络和实现原...
- Docker容器和存储系统 云舒网络
-
江松:1986开始接触到苹果电脑,不是MacBook,是APPLEII.用Basic编程序。1999年去欧洲爱尔兰做存储,从并行SCSI协议开始做,到FC1G,4G,8G。2009年回国后进...
- 基于docker的跨主机WEB容器管理
-
前言由于我们的一部分服务器,分布在不同的公共网络环境。而且,这些服务器程序,发布都使用了docker,但并没有使用k8s这样的工具。处于离散的管理状态。也考虑过rancher这样的工具,但对于我们来说...
- Kubernetes(k8s)docker 和 Containerd 区别
-
Kubernetes(k8s)、Docker和Containerd都是容器技术领域的重要工具,但它们各自有不同的角色和功能。Docker:Docker是一个开源的容器化平台,它允许开发者将应...
- 从 Docker 快刀到 K8s 剑法:程序员的云原生武功秘籍
-
前言在当今云计算的浪潮中,Docker和Kubernetes(K8s)已成为每位程序员必备的核心工具。Docker,如同一把锐利的快刀,能够迅速、简洁地将应用及其依赖封装成镜像,实现便捷的打包与发...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)