前端:音频可视化(H5+js版本)

一、效果展示

HTML5+JS实现一个简单的音频可视化

二、代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>音频可视化</title><style></style></head><body><divstyle="display: flex;justify-content: center;align-items: center;flex-direction: column;"><divclass="musicBox"style="position: relative; width: 500px; height: 500px"><canvasid="audioCanvas"width="500"height="500"style="position: absolute; left: 0; top: 0"></canvas><svgt="1716202136861"class="icon"viewBox="0 0 1024 1024"version="1.1"xmlns="http://www.w3.org/2000/svg"p-id="4458"width="68"height="68"style="position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);"><pathd="M701.6 196.53m-15 0a15 15 0 1 0 30 0 15 15 0 1 0-30 0Z"fill="#E159D3"p-id="4459"></path><pathd="M956.29 310.21a482.39 482.39 0 1 0-847.9 452v120.36c0 71.4 58.42 130.76 129.82 130.1a127.79 127.79 0 0 0 100.44-49.85 120.4 120.4 0 0 0 21-103.43c-5.58-21.49-11.71-59-11.71-71.71S354 737.47 359.62 716a120.4 120.4 0 0 0-21-103.43 128.55 128.55 0 0 0-209.75 9.13c-20.91-64.82-25.25-135-11.25-205.6 28.7-144.71 172.14-286.19 317.16-313.27C690.37 55.1 914.24 250.88 914.24 498a402.4 402.4 0 0 1-19.36 123.71 128.55 128.55 0 0 0-209.74-9.13 120.4 120.4 0 0 0-21 103.43c5.58 21.49 11.71 59 11.71 71.71s-6.13 50.22-11.71 71.71a120.4 120.4 0 0 0 21 103.43 127.8 127.8 0 0 0 101.67 49.85 128.59 128.59 0 0 0 128.58-128.62V762.25a483 483 0 0 0 40.9-452z m-767.9 381.87c0-26.24 20.49-48.33 46.71-49.34a48.41 48.41 0 0 1 40.41 18.85 39.94 39.94 0 0 1 6.78 34.34c-5.84 22.48-14.29 68.12-14.29 91.85s8.45 69.37 14.29 91.85a39.94 39.94 0 0 1-6.78 34.37A48.38 48.38 0 0 1 237 932.86a48.64 48.64 0 0 1-48.64-48.64z m647 191.4c0 26.24-20.49 48.33-46.71 49.34a48.41 48.41 0 0 1-40.4-18.82 39.94 39.94 0 0 1-6.78-34.34c5.84-22.48 14.29-68.12 14.29-91.85s-8.45-69.37-14.29-91.85a39.94 39.94 0 0 1 6.78-34.34 48.41 48.41 0 0 1 40.41-18.85c26.22 1 46.71 23.1 46.71 49.34z"fill="#E159D3"p-id="4460"></path><pathd="M651.51 154.09a371.39 371.39 0 0 0-419.35 100.28 373.69 373.69 0 0 0-30.07 39.56 15 15 0 1 0 25 16.52A341.48 341.48 0 0 1 512 157a339.17 339.17 0 0 1 128.23 24.93 15 15 0 1 0 11.29-27.79z"fill="#E159D3"p-id="4461"></path><pathd="M456.91 668.17c-20.66 1.25-37.52 19.95-37.52 40.65v157.92c0 20.7 16.85 39.4 37.52 40.65a40 40 0 0 0 42.48-39.93V708.1a40 40 0 0 0-42.48-39.93zM563.91 698.12c-20.66 1.25-37.52 19.95-37.52 40.65v98c0 20.7 16.85 39.4 37.52 40.65a40 40 0 0 0 42.48-39.93V738a40 40 0 0 0-42.48-39.88z"fill="#48BCFF"p-id="4462"></path></svg></div><audio id="audio" src="./audio/游戏城大冒险.mp3" controls></audio></div></body><script>//需要可视化的数据let audioArr;//我们需要一个音乐播放器和一个canvas进行显示const audioElement = document.getElementById("audio");const canvas = document.getElementById("audioCanvas");//canvas的一些基本设置const ctx = canvas.getContext("2d");const centerX = canvas.width / 2;const centerY = canvas.height / 2;const radius = 50; // 圆的半径//初始化let isInit = false;let analyser = null;// 当音乐播放audioElement.onplay = () => {if (!isInit) {isInit = true;}const audioContext = new AudioContext(); // 创建音频上下文const audioSrc = audioContext.createMediaElementSource(audioElement); // 创建音频源analyser = audioContext.createAnalyser(); // 创建分析器analyser.fftSize = 128; // 设置傅里叶变换的大小,影响线条密度audioArr = new Uint8Array(analyser.frequencyBinCount); // 创建一个无符号字节数组存储频率数据,该API参考ES6文档audioSrc.connect(analyser); // 连接音频源和分析器analyser.connect(audioContext.destination); // 连接分析器和音频目的地//动画开始animate();};// 绘制圆形const drawGradientCircle = () => {ctx.beginPath();// 创建一个从中心点向外的径向渐变const grd = ctx.createLinearGradient(centerX - radius,centerY - radius,centerX + radius,centerY + radius);grd.addColorStop("0", "purple");grd.addColorStop("0.3", "magenta");grd.addColorStop("0.5", "blue");grd.addColorStop("0.6", "green");grd.addColorStop("0.8", "yellow");grd.addColorStop(1, "red");ctx.strokeStyle = grd;ctx.arc(centerX, centerY, radius - 2, 0, Math.PI * 2); // 绘制一个完整的圆ctx.stroke(); // 画圆复制代码};//绘制线条const drawLinesFromCircle = () => {ctx.lineWidth = 2;//使用音频的频率数据绘制线条//为了美观,我们绘制两条线,一条是频率数据,另一条是对称的//也可以去使用其它的方式绘制线条audioArr.forEach((value, index) => {const baseAngle = (index / audioArr.length) * Math.PI * 2; // 基础角度const angle1 = baseAngle; // 第一条线的角度const angle2 = baseAngle + Math.PI; // 对称线的角度,相差π(180度)// 绘制第一条线{const endX1 = centerX + radius * Math.cos(angle1);const endY1 = centerY + radius * Math.sin(angle1);const startX1 = centerX + (radius + value * 0.4) * Math.cos(angle1); // 使用value控制长度const startY1 = centerY + (radius + value * 0.4) * Math.sin(angle1);ctx.beginPath();ctx.moveTo(startX1, startY1);ctx.lineTo(endX1, endY1);ctx.strokeStyle = `hsl(${index * 3.6}, 100%, 50%)`;ctx.stroke();}// 绘制对称的第二条线{const endX2 = centerX + radius * Math.cos(angle2);const endY2 = centerY + radius * Math.sin(angle2);const startX2 = centerX + (radius + value * 0.4) * Math.cos(angle2);const startY2 = centerY + (radius + value * 0.4) * Math.sin(angle2);ctx.beginPath();ctx.moveTo(startX2, startY2);ctx.lineTo(endX2, endY2);ctx.strokeStyle = `hsl(${(index + audioArr.length / 2) * 3.6}, 100%, 50%)`; // 调整颜色以保持对称性且有所区别ctx.stroke();}});};//播放动画const animate = () => {ctx.clearRect(0, 0, canvas.width, canvas.height); // 清除画布if (!isInit) return;analyser.getByteFrequencyData(audioArr); // 获取频率数据drawGradientCircle(); // 绘制圆形drawLinesFromCircle(); // 绘制伸展的线条requestAnimationFrame(animate); // 重复绘制以创建动画效果};</script>
</html>

三、VUE3+TS版本

前端:音频可视化(VUE3+TS版本)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非平稳信号的傅里叶变换与短时傅里叶变换

一、仿真一个非平稳的时间序列。 N 10000; t 0:N-1; z1 4.2*sin(2*pi/20.*t5); z2 2.2*sin(2*pi/100.*(10.001*t).*t8); w1 randn(length(t),1); yz1z2w1; figure;plot(y,LineWidth,1.5);grid on; ylabel(Signal); xlabel(Time); 二、傅里叶变换&#xff08;FFT&#xff…

教育智能化的历史及发展趋势

1. 教育智能化概述 1.1 定义与背景 教育智能化是指利用人工智能、大数据、云计算等现代信息技术&#xff0c;对教育过程进行智能化改造&#xff0c;提升教育质量与效率。随着技术进步&#xff0c;教育智能化已成为全球教育改革的重要趋势。 教育智能化的背景可以追溯到20世纪…

Llama 3超级课堂作业笔记

文章目录 基础作业完成 Llama 3 Web Demo 部署环境配置下载模型Web Demo 部署对话截图 使用 XTuner 完成小助手认知微调Web Demo 部署自我认知训练数据集准备训练模型推理验证 使用 LMDeploy 成功部署 Llama 3 模型环境&#xff0c;模型准备LMDeploy CLI chatLMDeploy模型量化(…

SQL Server 2022安装+SQL Server最新补丁+smss工具连接超详细教程

文章目录 一、SQL Server 2022安装二、SSMS的安装与连接三、最新补丁下载总结 一、SQL Server 2022安装 官网下载安装包&#xff1a;https://www.microsoft.com/en-us/sql-server/sql-server-downloads 打开 选择自定义 更改你要安装到的位置后进行安装 安装程序包下载完后会自…

将本地项目代码上传到别人GitHub的远程分支上流程记录

首先将别人的项目克隆到本地&#xff1a; git clone 项目地址 然后cd进项目中&#xff0c;查看分支名称&#xff1a; git branch git branch -a 切换分支&#xff1a; git checkout 远程分支名 &#xff08;必须与所要提交代码的远程分支同名&#xff09; 截图案例&#xff1…

简单的TCP网络程序:英译汉服务器

一、服务器的初始化 下面介绍程序中用到的socket API,这些函数都在sys/socket.h中。 1.创建套接字 socket()&#xff1a; ⭐参数介绍&#xff1a; socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符;应用程序可以像读写文件一样用read/write在网…

AI大模型日报#0523:中国大模型价格战的真相、大模型「上车」、王小川首款 AI 应用

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-Large&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…

04. Redis 配置文件

文章目录 单位包含网络 NETWORK通用 GENERAL快照 SNAPSHOTTING主从复制 REPLICATION安全 SECURITY客户端 CLIENTS内存设置 MEMORY MANAGEMENTAPPEND ONLY MODE 模式&#xff08;aof 的配置&#xff09; 单位 配置文件对大小写不敏感&#xff08;unit单位&#xff09;。 包含 …

Flutter 中的 WillPopScope 小部件:全面指南

Flutter 中的 WillPopScope 小部件&#xff1a;全面指南 在 Flutter 应用开发中&#xff0c;WillPopScope 是一个非常有用的小部件&#xff0c;它允许开发者拦截和处理用户尝试退出当前页面的操作。这在需要确认用户是否真的想要离开当前页面&#xff0c;或者在离开前需要执行…

京东h5st加密参数分析与批量商品价格爬取(文末含纯算法)

文章目录 1. 写在前面2. 接口分析3. 加密分析4. 算法还原【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【🌟作者推…

罗德与施瓦茨ZNB20矢量网络分析仪怎么读取Trace?

矢量网络分析仪(VNA)是电子测量领域广泛应用的重要仪器&#xff0c;可以帮助工程师精确测量各种射频和微波设备的参数&#xff0c;为设计优化、故障诊断等提供关键数据支持。作为业界领先的VNA制造商&#xff0c;罗德与施瓦茨的ZNB20型号在测量精度、动态范围、扫描速度等方面都…

家政预约小程序05服务管理

目录 1 设计数据源2 后台管理3 后端API4 调用API总结 家政预约小程序的核心是展示家政公司提供的各项服务的能力&#xff0c;比如房屋维护修缮&#xff0c;家电维修&#xff0c;育婴&#xff0c;日常保洁等。用户在选择家政服务的时候&#xff0c;价格&#xff0c;评价是影响用…

中国网对话神工坊创始人任虎: 先进计算技术赋能,领跑自主CAE新时代

随着"中国制造2025"收官在即&#xff0c;智能制造和工业互联网的发展势头更劲。作为现代工业的基石&#xff0c;工业软件已成为推动工业数字化转型的关键力量。 近日&#xff0c;神工坊创始人&CEO任虎先生接受了中国网记者的专访&#xff0c;就“国产CAE软件的崛…

C++中的Lambda的定义与使用

文章目录 前言Lambda的定义与使用方式总结 Lambda的使用和细节 前言 在C11引入了Lambda表达式&#xff0c;它是一种方便的匿名函数&#xff0c;可以在需要时临时定义函数&#xff0c;并且可以捕获局部变量。下面是Lambda表达式的定义与使用方式&#xff0c;并对其进行总结 La…

【东山派Vision K510开发板试用笔记】nncase的安装

概述 最近试用了百问网提供的东山派Vision开发板&#xff0c;DongshanPI-Vision开发板是百问网针对AI应用开发设计出来的一个RSIC-V架构的AI开发板&#xff0c;主要用于学习使用嘉楠的K510芯片进行Linux项目开发和嵌入式AI应用开发等用途。DongshanPI-Vision开发板采用嘉楠公司…

持续总结中!2024年面试必问 20 道 Redis面试题(三)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道 Redis面试题&#xff08;二&#xff09;-CSDN博客 五、Redis的持久化机制是什么&#xff1f;各自的优缺点&#xff1f; Redis的持久化机制主要有三种&#xff1a;RDB持久化、AOF持久化以及混合持久化。下面…

Android 13 QSSI和TARGET编译时间不一致导致recovery升级失败

环境 $ cat /etc/os-release NAME"Ubuntu" VERSION"20.04.4 LTS (Focal Fossa)" IDubuntu ID_LIKEdebian PRETTY_NAME"Ubuntu 20.04.4 LTS" VERSION_ID"20.04" HOME_URL"https://www.ubuntu.com/" SUPPORT_URL"https:/…

寡姐不高兴了:这次可能会让 OpenAI 遇到真正的麻烦|TodayAI

寡姐这次真不高兴了 演员斯嘉丽约翰逊&#xff08;Scarlett Johansson&#xff09;近日表示&#xff0c;她拒绝了 OpenAI 的邀请&#xff0c;不愿为对话式 ChatGPT 系统配音&#xff0c;却发现公司仍然使用了一个听起来非常像她的声音。对此&#xff0c;她感到“震惊”和“愤怒…

react状态管理

状态管理的实现 组件之外&#xff0c;可以在全局共享状态/数据 closure&#xff08;闭包&#xff09; 可以解决 有修改这个数据的明确方法&#xff0c;并且&#xff0c;能够让其他的方法感知到。 本质上&#xff0c;就是把监听函数放在一个地方&#xff0c;必要时拿出来执行一…

Java数据结构与算法(最小栈)

前言 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。i…