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

news2024/10/5 15:45:04

一、效果展示

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

二、代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>音频可视化</title>
    <style></style>
  </head>
  <body>
    <div
      style="
        display: flex;
        justify-content: center;
        align-items: center;
        flex-direction: column;
      "
    >
      <div
        class="musicBox"
        style="position: relative; width: 500px; height: 500px"
      >
        <canvas
          id="audioCanvas"
          width="500"
          height="500"
          style="position: absolute; left: 0; top: 0"
        ></canvas
        ><svg
          t="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%);
          "
        >
          <path
            d="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>
          <path
            d="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>
          <path
            d="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>
          <path
            d="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.coloradmin.cn/o/1699817.html

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

相关文章

python mp3转mp4工具

成品UI 安装moviepy库 pip install moviepy 转换demo from moviepy.editor import *# 创建一个颜色剪辑&#xff0c;时长与音频相同 audioclip AudioFileClip(r"C:\Users\Administrator\PycharmProjects\pythonProject44\test4\赵照 - 灯塔守望人.mp3") videoclip…

P6160 [Cnoi2020] 向量

[Cnoi2020] 向量 题目背景 向量(vector)&#xff0c;指具有大小(Magnitude)和方向(Direction) 的量。 与向量对应的量叫做数量(Scalar)&#xff0c;数量只有大小&#xff0c;没有方向。 对于 Cirno 来说&#xff0c;整天环绕氷屋的旋转 Sangetsusei 们是向量而不是数量。 Sun…

Spring Cloud 项目中使用 Swagger

Spring Cloud 项目中使用 Swagger 关于方案的选择 在 Spring Cloud 项目中使用 Swagger 有以下 4 种方式&#xff1a; 方式一 &#xff1a;在网关处引入 Swagger &#xff0c;去聚合各个微服务的 Swagger。未来是访问网关的 Swagger 原生界面。 方式二 &#xff1a;在网关处引…

关于C的\r回车在不同平台的问题

首先我们需要搞明白\r和\n是两回事 \r是回车&#xff0c;前者使光标到行首&#xff0c;&#xff08;carriage return&#xff09; \n是换行&#xff0c;后者使光标下移一格&#xff0c;&#xff08;line feed&#xff09; Linux平台下 #include <stdio.h> int main()…

C++的AVL树

目录 基本概念 插入的语言分析 LL右旋 RR左旋 额外结论及问题1 LR左右旋 RL右左旋 额外结论及问题2 插入结点 更新bf与判断旋转方式 旋转代码实现 准备工作一 LL右旋的实现 RR左旋的实现 准备工作二 LR左右旋的实现 RL右左旋的实现 完整代码 基本概念 1、…

机器学习算法手撕(一):KD树

import math import matplotlib.pyplot as pltclass Node:def __init__(self, data, leftNone, rightNone):self.data dataself.left leftself.right right# 创建KDTree类 class KDTree:def __init__(self, k):self.k kdef create_tree(self,dataset,depth):if not dataset…

Docker CIG使用

Docker CIG是什么 CIG为&#xff1a;CAdvisor监控收集、InfluxDB存储数据、Granfana图表展示 这个组合是一个常见的监控 Docker 容器的解决方案,它包括以下三个组件: cAdvisor (Container Advisor): cAdvisor 是一个开源的容器资源监控和性能分析工具。它能够收集有关正在运行的…

Java实现图书系统

首先实现一个图书管理系统,我们要知道有哪些元素? 1.用户分成为管理员和普通用户 2.书:书架 书 3.操作的是: 书架 目录 第一步:建包 第二步:搭建框架 首先:完成book中的方法 其次:完成BookList 然后:完成管理员界面和普通用户界面 最后:Main 第三步:细分方法 1.退…

除自身以外数组的乘积 ---- 前缀和

题目链接 题目: 分析: 计算某个区间的积, 同样可以使用前缀和算法的思想想要计算除i位置的积, 我们需要计算i位置之前[0,i-1]的前缀积 和 i位置之后[i1,n-1]的后缀积, n表示数组的长度 先求[0,i - 1]的积 用一个前缀数组f 此时f[i] 表示: 前i - 1个数的积, 那么f[i - 1] 就表…

虹科Pico汽车示波器 | 免拆诊断案例 | 2012 款雪佛兰科鲁兹车偶尔多个故障灯异常点亮

故障现象 一辆2012款雪佛兰科鲁兹车&#xff0c;搭载1.8 L 发动机&#xff0c;累计行驶里程约为9.6万km。该车组合仪表上的发动机故障灯、ABS故障灯及动力转向故障灯偶尔异常点亮&#xff0c;同时发动机转速表和发动机冷却液温度表的指针会突然归零&#xff0c;严重时发动机无…

上下文视觉提示实现zero-shot分割检测及多visual-prompt改造

文章目录 一、Closed-Set VS Open-set二、DINOv2.1 论文和代码2.2 内容2.3 安装部署2.4 使用效果 三、多visual prompt 改造3.1 获取示例图mask3.2 修改函数参数3.3 推理代码3.4 效果的提升&#xff01; 四、总结 本文主要介绍visual prompt模型DINOv&#xff0c;该模型可输入八…

Qt for Android 乱码问题

java文件乱码 导致编译失败 使用notepad等查看java文件的编码&#xff0c; 修改成utf-8&#xff0c;否则会因为乱码编译失败&#xff0c; 记住是utf8不是utf8-bom. 做如下修改确保utf8文件不被修改掉。 编译时错误显示的是乱码 如果开发其他乱码再改回&#xff0c; 原本是Sys…

【机器学习300问】99、多通道卷积神经网络在卷积操作时有哪些注意事项?

一、多通道卷积神经网络示例 还是以图像处理为例&#xff0c;如果你的目标不仅是分析灰度图像特性&#xff0c;还打算捕捉RGB彩色图像的特征。如下图&#xff0c;当面对一张66像素的彩色图像时&#xff0c;提及的“3”实际上是指红、绿、蓝三种颜色通道&#xff0c;形象地说&am…

BUUCTF-Misc24

从娃娃抓起1 1.打开附件 是两个文本文件 2.电报码 电报码在线翻译网站&#xff1a;https://usetoolbar.com/convert/cccn.html 3.汉字五笔编码 汉字五笔编码在线网站查询&#xff1a;https://www.qqxiuzi.cn/bianma/wubi.php 4.转化为MD5值 将文字保存到文本文档 用winR输入…

绘唐3模型怎么放本地sd安装及模型放置位置 及云端sd部署

绘唐3模型怎么放本地sd安装及模型放置位置 及云端sd部署 资料里面授权方式&#xff1a; https://qvfbz6lhqnd.feishu.cn/wiki/CcaewIWnSiAFgokOwLycwi0Encf 云端和模型之间存在某种关联性。云端通常用于存储和管理大量数据&#xff0c;并提供计算和资源的服务。模型是对数据进…

Day04:CSS 进阶

目标&#xff1a;掌握复合选择器作用和写法&#xff1b;使用background属性添加背景效果 一、复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09;。 1、后…

蚁小二:又一款高效自媒体工具,免费用户可发5个账号

其实自媒体的群发工具有几个&#xff0c;除了前几天介绍的融媒宝还有蚁小二等。因为融媒宝免费用户只能添加5个账号&#xff0c;所以不够用的朋友可以再下载蚁小二使用&#xff0c;这样就有10个账号可以发布了&#xff1a; 蚁小二简介 蚁小二是由长沙草儿绽放科技有限公司自主…

【论文阅读】Prompt Fuzzing for Fuzz Driver Generation

文章目录 摘要一、介绍二、设计2.1、总览2.2、指导程序生成2.3、错误程序净化2.3.1、执行过程净化2.3.2、模糊净化2.3.3、覆盖净化 2.4、覆盖引导的突变2.4.1、功率调度2.4.2、变异策略 2.5、约束Fuzzer融合2.5.1、论据约束推理2.5.1、模糊驱动融合 三、评估3.1、与Hopper和OSS…

Honeyview看图神器,免费无广告!

之前看图软件使用的是BandiView&#xff0c;但是最近频繁弹出广告&#xff0c;今天换了款Honeyview&#xff0c;也叫蜜蜂浏览器&#xff0c;免费无广告&#xff0c;速度很快&#xff0c;还以直接查看压缩包中的图片&#xff0c;你懂的&#xff01; 软件设置 首先随便打开一张图…

Virtual Box安装Ubuntu及设置

Virtual Box安装Ubuntu及设置 本文包含以下内容&#xff1a; 使用Virtual Box安装Ubuntu Desktop。设置虚拟机中的Ubuntu&#xff0c;使之可访问互联网并可通过SSH访问。 Ubuntu Desktop下载 从官网下载&#xff0c;地址为&#xff1a;Download Ubuntu Desktop | Ubuntu U…