js-基于AudioContext在canvas上显示声音波形

2024-09-05 11:48

本文主要是介绍js-基于AudioContext在canvas上显示声音波形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

js-基于AudioContext在canvas上显示声音波形 目录

文章目录

  • 前言
  • 效果展示
  • 代码展示
    • `index.html`
    • `Aud.js`


前言

  • ES7后开始启用AudioContex
  • 常用API是:createScriptProcessor, onaudioprocess, getChannelData
  • 注意:onaudioprocess已经废弃,开始改用AnalyserNode,MDN-AnalyserNode

效果展示

在这里插入图片描述

代码展示

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Canvas Audio</title><style>body, div {margin: 0px;padding: 0px;text-align: center;}#cav {border: 1px solid black;border-radius: 4px;margin: 10px auto;}</style>
</head>
<body>
<canvas id="cav" width="400" height="300"></canvas>
</body>
<script src="Aud.js"></script>
<script>
let ctx = document.getElementById('cav').getContext('2d');
let SampleSize = 1024;window.onload = function (){init();
};function init() {AudManager.urls = ["test.mp3"];AudManager.init();AudManager.load(()=>{let jNode = AudManager.createNode(2, [SampleSize, 1, 1]);let pNode = AudManager.createNode();ctx.strokeStyle = "red";jNode.onaudioprocess = function (e){renderWave(e);};let sound1 = AudManager.items[0];sound1.addNode(pNode);sound1.addNode(jNode, 1);sound1.play();});
}function renderWave(e){ctx.clearRect(0,0,400,300);let bufData = e.inputBuffer.getChannelData(0);ctx.beginPath();ctx.moveTo(0,150);for (let i = 0, len = bufData.length, mix = Math.min(400, len); i < mix; i++){ctx.lineTo(i, bufData[i]*150+150);}ctx.stroke();ctx.closePath();
}
</script>
</html>

Aud.js

let Aud = function (ctx, url) {this.ctx = ctx;this.url = url;//    source节点this.src = ctx.createBufferSource();//    多个处理节点组this.pNode = [];
};Aud.prototype = {output(){for (let i = 0; i < this.pNode.length; i++){let tNode = this.src;for (let j = 0; j < this.pNode[i].length; j++){tNode.connect(this.pNode[i][j]);tNode = this.pNode[i][j];}tNode.connect(this.ctx.destination);}},play(loop){this.src.loop = loop || false;this.output();this.src.start(0);},stop() {this.src.stop();},addNode(node, groupIdx = 0){this.pNode[groupIdx] = this.pNode[groupIdx] || [];this.pNode[groupIdx].push(node);}
};//设置节点类型
Aud.NODETYPE = {GNODE: 0 // 表示gainNode节点
}//Aud管理对象
AudManager = {urls: [],items: [],ctx: null,init(){try{this.ctx = new AudioContext();}catch (e) {console.log(`${e}`);}},load(callback){for (let i = 0; i < this.urls.length; i++){this.loadSingle(this.urls[i], callback);}},loadSingle(url, callback){let req = new XMLHttpRequest();req.open('GET', url, true);req.responseType = 'arraybuffer';let self = this;req.onload = function () {self.ctx.decodeAudioData(this.response).then(buf => {let aud = new Aud(self.ctx, url);aud.src.buffer = buf;self.items.push(aud);if (self.items.length == self.urls.length){callback();}},err => {console.log(`decode error:${err}`);})};req.send();},createNode(nodeType, param){let node = null;switch (nodeType) {case 1:node = this.ctx.createPanner();break;case 2:node = this.ctx.createScriptProcessor(param[0], param[1], param[2]);break;default:node = this.ctx.createGain();}return node;}
};

这篇关于js-基于AudioContext在canvas上显示声音波形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138876

相关文章

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2