让音乐“看得见”:使用 HTML + JavaScript 实现酷炫的音频可视化播放器

news2025/6/9 11:08:09

在这个数字时代,音乐不仅是听觉的享受,更可以成为视觉的盛宴!本文用 HTML + JavaScript 实现了一个音频可视化播放器,它不仅能播放本地音乐、控制进度和音量,还能通过 Canvas 绘制炫酷的音频频谱图,让你“听见色彩,看见旋律”。

效果演示

image-20250604212523138

image-20250604212640313

核心功能

本项目主要包含以下核心功能:

  • 音频播放控制:支持播放、暂停、上一首、下一首等基本操作。
  • 进度控制:显示当前播放时间和总时长,并支持点击进度条跳转。
  • 音量调节:提供滑动条调节播放音量。
  • 播放列表管理:支持动态添加本地音乐文件,显示播放列表并高亮当前播放曲目。
  • 音频可视化:通过Canvas实时绘制音频频谱图,增强用户体验。

页面结构

音频可视化容器

使用 HTML5 的 canvas 元素来绘制动态的音频频谱图。

<div class="visualizer">
    <canvas id="visualizer"></canvas>
</div>
操作控制区域

整个音乐播放器的主要控制区域,包含播放进度条与时间显示、播放控制按钮、音量调节滑块、文件上传控件。

<div class="controls">
    <div class="progress-container" id="progress-container">
        <div class="progress-bar" id="progress-bar"></div>
    </div>
    <div class="time-display">
        <span id="current-time">0:00</span>
        <span id="total-time">0:00</span>
    </div>
    <div class="control-row">
        <div class="left"></div>
        <div class="buttons">
            <button id="prev-btn">上一首</button>
            <button id="play-btn">播放</button>
            <button id="next-btn">下一首</button>
        </div>
        <div class="volume-control">
            <span>音量</span>
            <input type="range" min="0" max="1" step="0.01" value="0.7" class="volume-slider" id="volume-control">
        </div>
    </div>
    <div class="file-upload">
        <input type="file" id="file-input" accept="audio/*" multiple>
        <label for="file-input">添加音乐文件</label>
    </div>
</div>
播放列表区域

该区域用于展示用户上传的音频文件列表,并提供一个初始为空时的提示信息。

<div class="playlist">
    <h2>播放列表</h2>
    <div id="playlist-items">
        <div class="empty-playlist">暂无音乐,请添加音乐文件</div>
    </div>
</div>

核心功能实现

添加本地音乐文件

使用 URL.createObjectURL 创建本地文件链接供 audio 播放。

function addMusicFiles(files) {
   
    for (let i = 0; i < files.length; i++) {
   
        const file = files[i];
        const url = URL.createObjectURL(file);
        playlist.push({
   
            name: file.name.replace(/\.[^/.]+$/, ""), // 移除扩展名
            url: url
        });
    }
    // 如果是第一次添加音乐,自动加载第一首
    if (playlist.length === files.length) {
   
        currentTrack = 0;
        loadTrack();
    }
    renderPlaylist();
}
加载当前曲目
function loadTrack() {
   
    if (playlist.length === 0) return;

    const track = playlist[currentTrack];
    audio.src = track.url;
    audio.load();

    updatePlaylistHighlight();

    if (isPlaying) {
   
        audio.play().catch(e => console.log('播放错误:', e));
    }
}
播放/暂停控制

判断播放列表是否为空,控制播放状态切换,并更新按钮文本,如果播放失败尝试下一首。

function togglePlay() {
   
    if (playlist.length === 0) {
   
        alert('播放列表为空,请先添加音乐');
        return;
    }

    if (isPlaying) {
   
        audio.pause();
        playBtn.textContent = '播放';
    } else {
   
        initAudioContext(); // 首次播放时才初始化音频上下文
        audio.play().catch(e => {
   
            console.log('播放错误:', e);
            nextTrack(); // 播放失败自动下一首
        });
        playBtn.textContent = '暂停';
    }
    isPlaying = !isPlaying;
}
音频上下文初始化

初始化 AudioContext,创建音频分析节点,将音频元素通过 createMediaElementSource 接入分析器,dataArray 用于后续可视化绘制。

function initAudioContext() 

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

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

相关文章

CAD实体对象智能识别

CAD实体对象智能识别 概述 实体对象智能识别能够在CAD图纸中智能识别和匹配相似的实体对象。该系统采用模式匹配算法&#xff0c;支持几何变换&#xff08;缩放、旋转&#xff09;&#xff0c;并提供了丰富的配置选项和可视化界面。 系统提供两种主要的识别方式&#xff1a;…

LabVIEW音频测试分析

LabVIEW通过读取指定WAV 文件&#xff0c;实现对音频信号的播放、多维度测量分析功能&#xff0c;为音频设备研发、声学研究及质量检测提供专业工具支持。 主要功能 文件读取与播放&#xff1a;支持持续读取示例数据文件夹内的 WAV 文件&#xff0c;可实时播放音频以监听被测信…

RoseMirrorHA 双机热备全解析

在数字化时代&#xff0c;企业核心业务系统一旦瘫痪&#xff0c;每分钟可能造成数万甚至数十万的损失。想象一下&#xff0c;如果银行的交易系统突然中断&#xff0c;或者医院的挂号系统无法访问&#xff0c;会引发怎样的连锁反应&#xff1f;为了守护这些关键业务&#xff0c;…

day 18进行聚类,进而推断出每个簇的实际含义

浙大疏锦行 对聚类的结果根据具体的特征进行解释&#xff0c;进而推断出每个簇的实际含义 两种思路&#xff1a; 你最开始聚类的时候&#xff0c;就选择了你想最后用来确定簇含义的特征&#xff0c; 最开始用全部特征来聚类&#xff0c;把其余特征作为 x&#xff0c;聚类得到…

LLMs 系列科普文(6)

截止到目前&#xff0c;我们从模型预训练阶段的数据准备讲起&#xff0c;谈到了 Tokenizer、模型的结构、模型的训练&#xff0c;基础模型、预训练阶段、后训练阶段等&#xff0c;这里存在大量的术语或名词&#xff0c;也有一些奇奇怪怪或者说是看起来乱七八糟的内容。这期间跳…

serv00 ssh登录保活脚本-邮件通知版

适用于自己有服务器情况&#xff0c;ssh定时登录到serv00&#xff0c;并在登录成功后发送邮件通知 msmtp 和 mutt安装 需要安装msmtp 和 mutt这两个邮件客户端并配置&#xff0c;参考如下文章前几步是讲配置这俩客户端的&#xff0c;很简单&#xff0c;不再赘述 用Shell脚本实…

意识上传伦理前夜:我们是否在创造数字奴隶?

当韩国财阀将“数字永生”标价1亿美元准入权时&#xff0c;联合国预警的“神经种姓制度”正从科幻步入现实。某脑机接口公司用户协议中“上传意识衍生算法归公司所有”的隐藏条款&#xff0c;恰似德里达预言的当代印证&#xff1a;“当意识沦为可交易数据流&#xff0c;主体性便…

【AIGC】RAGAS评估原理及实践

【AIGC】RAGAS评估原理及实践 &#xff08;1&#xff09;准备评估数据集&#xff08;2&#xff09;开始评估2.1 加载数据集2.2 评估忠实性2.3 评估答案相关性2.4 上下文精度2.5 上下文召回率2.6 计算上下文实体召回率 RAGas&#xff08;RAG Assessment)RAG 评估的缩写&#xff…

ESP12E/F 参数对比

模式GPIO0GPIO2GPIO15描述正常启动高高低从闪存运行固件闪光模式低高低启用固件刷写 PinNameFunction1RSTReset (Active Low)2ADC (A0)Analog Input (0–1V)3EN (CH_PD)Chip Enable (Pull High for Normal Operation)4GPIO16Wake from Deep Sleep, General Purpose I/O5GPIO14S…

第二十八章 字符串与数字

第二十八章 字符串与数字 计算机程序完全就是和数据打交道。很多编程问题需要使用字符串和数字这种更小的数据来解决。 参数扩展 第七章,已经接触过参数扩展,但未进行详细说明,大多数参数扩展并不用于命令行,而是出现在脚本文件中。 如果没有什么特殊原因,把参数扩展放…

[RDK X5] MJPG编解码开发实战:从官方API到OpenWanderary库的C++/Python实现

业余时间一直在基于RDK X5搞一些小研究&#xff0c;需要基于高分辨率图像检测目标。实际落地时&#xff0c;在图像采集上遇到了个大坑。首先&#xff0c;考虑到可行性&#xff0c;我挑选了一个性价比最高的百元内摄像头&#xff0c;已确定可以在X5上使用&#xff0c;接下来就开…

aardio 简单网页自动化

WebView自动化&#xff0c;以前每次重复做网页登录、搜索这些操作时都觉得好麻烦&#xff0c;现在终于能让程序替我干活了&#xff0c;赶紧记录下这个超实用的技能&#xff01; 一、初次接触WebView WebView自动化就像给程序装了个"网页浏览器"&#xff0c;第一步得…

打卡第39天:Dataset 和 Dataloader类

知识点回顾&#xff1a; 1.Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09; 2.Dataloader类 3.minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torch.nn as nn import…

如何做好一份优秀的技术文档:专业指南与最佳实践

如何做好一份优秀的技术文档&#xff1a;专业指南与最佳实践 技术文档是产品开发、用户支持和团队协作的核心工具。高质量的技术文档能够提升开发效率、降低维护成本并改善用户体验。本文将从实践出发&#xff0c;详细讲解如何编写专业、清晰且实用的技术文档。 &#x1f31f;…

TCP相关问题 第一篇

TCP相关问题1 1.TCP主动断开连接方为什么需要等待2MSL 如上图所示:在被动链接方调用close&#xff0c;发送FIN时进入LAST_ACK状态&#xff0c;但未收到主动连接方的ack确认&#xff0c;需要被动连接方重新发送一个FIN&#xff0c;而为什么是2MSL&#xff0c;一般认为丢失ack在…

6.Pandas 数据可视化图-1

第三章 数据可视化 文章目录 目录 第三章 数据可视化 文章目录 前言 一、数据可视化 二、使用步骤 1.pyplot 1.1引入库 1.2 设置汉字字体 1.3 数据准备 1.4 设置索引列 ​编辑 1.5 调用绘图函数 2.使用seaborn绘图 2.1 安装导入seaborn 2.2 设置背景风格 2.3 调用绘图方法 2.…

软件功能测试报告都包含哪些内容?

软件功能测试报告是软件开发生命周期中的重要文档&#xff0c;主要涵盖以下关键内容&#xff1a;    1.测试概况&#xff1a;概述测试目标、范围和方法&#xff0c;确保读者对测试背景有清晰了解。 2.测试环境&#xff1a;详细描述测试所用的硬件、软件环境&#xff0c;确保…

在Vue或React项目中使用Tailwind CSS实现暗黑模式切换:从系统适配到手动控制

在现代Web开发中&#xff0c;暗黑模式(Dark Mode)已成为提升用户体验的重要功能。本文将带你使用Tailwind CSS在React项目(Vue项目类似)中实现两种暗黑模式控制方式&#xff1a; 系统自动适配 - 根据用户设备偏好自动切换手动切换 - 通过按钮让用户自由选择 一、项目准备 使…

Linux--命令行参数和环境变量

1.命令行参数 Linux 命令行参数基础 1.1参数格式 位置参数&#xff1a;无符号&#xff0c;按顺序传递&#xff08;如 ls /home/user 中 /home/user 是位置参数&#xff09; 选项参数&#xff1a; 短选项&#xff1a;以 - 开头&#xff0c;单个字母&#xff08;如 -l 表示长格…

springboot线上教学平台

摘要&#xff1a;在社会快速发展的影响下&#xff0c;使线上教学平台的管理和运营比过去十年更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上线上教学平台系统是一项十分重要并且有价值的事情。对于传统的线上教学平台控制模型来说&#xff0c;网上线上…