前端小项目基础版本----时刻监听audio音频的声音高低 可视化显示+源码

news2024/12/28 19:42:10

目录

    • 时刻监听audio音频的声音高低
    • 第一代实现:基本
    • 第二代实现:完善

时刻监听audio音频的声音高低

前端小项目基础----时刻监听audio音频的声音高低 可视化显示

第一代实现:基本

实现的效果
根据 音频的某时刻高低 调整生成不同的柱状

在这里插入图片描述

以下就是 源码

直接复制粘贴 找个音频放进去就行了

后期优化: 准备 根据一些常见的搭建布局 实现一个音乐网站的搭建 : 等我后期优化 之后会在发布完整的_

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            background-color: pink;
            flex-direction: column;
        }

        .con {
            width: 50%;
            min-height: 200px;
            height: 270px;
            background-color: #333;
            border-radius: 10px;
            margin: 20px 0;
            display: flex;
            justify-content: flex-start;
            align-items: center;
        }

        .math {
            display: block;
            width: 5px;
            height: 90%;
            margin: 0 2px;
            border-radius: 4px;
            background-color: aqua;
        }
    </style>
</head>

<body>
    <!-- <audio src="./water.mp3" id="myAudio" controls></audio> -->
    <div class="con">
        <i class="math"></i>
    </div>
    <!-- <audio src="./water.mp3" id="myAudio" controls></audio> -->
    <audio src="./ancient.mp3" id="myAudio" controls></audio>

    <script>
        // 获取 audio 元素
        const audio = document.getElementById('myAudio');
        let con = document.querySelector(".con")

        audio.onplay = function () {

            // 创建 AudioContext 对象
            const audioCtx = new AudioContext();

            // 创建 AnalyserNode 对象
            const analyser = audioCtx.createAnalyser();

            // 将 AnalyserNode 对象连接到 AudioContext 的 destination 上
            analyser.connect(audioCtx.destination);

            // 将 audio 元素连接到 AnalyserNode 上
            const source = audioCtx.createMediaElementSource(audio);
            source.connect(analyser);

            // 设置 AnalyserNode 的参数
            analyser.fftSize = 256;
            const bufferLength = analyser.frequencyBinCount;
            const dataArray = new Uint8Array(bufferLength);

            // 开始获取声音数据
            // 循环获取声音数据并处理
            function update() {
                requestAnimationFrame(update);
                analyser.getByteFrequencyData(dataArray);
                // 处理声音数据
                for (let i = 0; i < bufferLength; i+=2000) {
                    const value = dataArray[i];
                    // 创建元素
                    console.log(value);
                    var app = document.createElement('i')
                    app.classList.add('math')
                    app.style.height = value + "px"
                    app.style.minHeight = 20 + "px"
                    con.appendChild(app)
                    
                    // 长度删除
                    if (con.children.length >60) {
                        con.removeChild(con.firstChild)
                    }
                }
            }
            audio.play();
            update();
        }

    </script>

</body>

</html>

第二代实现:完善

效果图
在这里插入图片描述

添加了 音频波浪的颜色动画

实现了音乐的切换功能

完善了背景的显示

调整了布局

以下是源码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .bodycon {
            position: fixed;
            top: 0;
            left: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            width: 100%;
            min-height: 100vh;
            /* background-color: pink; */
            flex-direction: column;
            overflow: hidden;
        }

        .con {
            width: 50%;
            min-height: 200px;
            height: 270px;
            background-color: #333;
            border-radius: 10px;
            margin: 20px 0;
            display: flex;
            justify-content: flex-start;
            align-items: center;
        }

        .math {
            display: block;
            width: 5px;
            height: 90%;
            margin: 0 2px;
            border-radius: 4px;
            background-color: aqua;
            animation: change 2s linear infinite;
        }
        @keyframes change {
            0%{
                filter: hue-rotate(0);
            }
            100%{
                filter: hue-rotate(360deg);
            }
        }

        .menu ul {
            list-style: none;
            display: flex;
            justify-content: space-between;
            align-items: center;
            height: 200px;
            width: 700px
        }

        .menu ul li {
            width: 20%;
            height: 40%;
            margin: 0 10px;
            display: flex;
            justify-content: center;
            align-items: center;
            border-radius: 4%;
            background-color: orange;
            cursor: pointer;
            transition: 0.5s linear;
        }

        .menu ul li:hover {
            transform: scale(1.1);
            filter: hue-rotate(30deg);
            border-radius: 17%;
        }

        .menu ul li.activeone {
            color: #fff;
            background-color: #333;

        }

        body {
            width: 100vw;
            height: 100vh;
            overflow: hidden;
        }
        .bj {
            width: 100%;
            height: 100%;
        }
        .bj video {
            width: 100%;
            height: 100%;
            transform: scale(1.4);
        }
    </style>
</head>

<body>
    <div class="bj">
        <video src="./bj.mp4" controls autoplay muted loop></video>
    </div>
    <div class="bodycon">

        <div class="con">
            <i class="math"></i>
        </div>
        <!-- <audio src="./water.mp3" id="myAudio" controls></audio> -->
        <audio src="./ancient.mp3" id="myAudio" controls></audio>


        <div class="menu">
            <ul>
                <li data-value="water.mp3">水声</li>
                <li data-value="dj.mp3">dj</li>
                <li data-value="wind.mp3"></li>
                <li data-value="ancient.mp3">古风</li>
                <li data-value="lingling.mp3">玲玲</li>
            </ul>

        </div>
    </div>

    <script>
        // 获取 audio 元素
        const audio = document.getElementById('myAudio');
        let con = document.querySelector(".con")

        audio.onplay = function () {

            // 创建 AudioContext 对象
            const audioCtx = new AudioContext();

            // 创建 AnalyserNode 对象
            const analyser = audioCtx.createAnalyser();

            // 将 AnalyserNode 对象连接到 AudioContext 的 destination 上
            analyser.connect(audioCtx.destination);

            // 将 audio 元素连接到 AnalyserNode 上
            const source = audioCtx.createMediaElementSource(audio);
            source.connect(analyser);

            // 设置 AnalyserNode 的参数
            analyser.fftSize = 256;
            const bufferLength = analyser.frequencyBinCount;
            const dataArray = new Uint8Array(bufferLength);

            // 开始获取声音数据
            // 循环获取声音数据并处理
            function update() {
                requestAnimationFrame(update);
                analyser.getByteFrequencyData(dataArray);
                // 处理声音数据
                for (let i = 0; i < bufferLength; i += 2000) {
                    const value = dataArray[i];
                    // 创建元素
                    var app = document.createElement('i')
                    app.classList.add('math')
                    app.style.height = value + "px"
                    app.style.minHeight = 20 + "px"
                    con.appendChild(app)

                    // 长度删除
                    if (con.children.length > 60) {
                        con.removeChild(con.firstChild)
                    }
                }
            }
            audio.play();
            update();
            // setInterval(update,100)

        }
        audio.onpause = function () {
            audio.onplay = null
        }

        // 获取li
        li_list = document.querySelectorAll('.menu ul>li')

        li_list.forEach(function (ele, index) {
            ele.onclick = function () {
                li_list.forEach(function (ele, index) {
                    ele.classList.remove('activeone')
                })
                ele.classList.add('activeone')
                audio.src = ele.dataset.value
            }
        })


    </script>

</body>

</html>

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

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

相关文章

AIGC技术研究与应用 ---- 下一代人工智能:新范式!新生产力!(2.3-大模型发展历程 之 图像、视频生成与视觉大模型)

文章大纲 GAN 模型与强化学习强化学习生成式对抗网络 ( Generative Adversarial Nets, GAN)VAE扩散模型扩散逆扩散参考文献与学习路径GPT 系列模型解析前序文章模型进化券商研报陆奇演讲强化学习生成模型多模态GAN 模型与强化学习 强化学习 Reinforcement learning (RL) is …

【SpinalHDL快速入门】4.5、复合类型之Bundle

文章目录 1.1、描述1.2、声明1.2.1、条件信号&#xff08;Conditional signals&#xff09; 1.3、运算符1.3.1、比较&#xff08;Comparison&#xff09;1.3.2、类型转换&#xff08;Type cast&#xff09;1.3.3、将比特转换回 Bundle 1.4、IO元素方向1.4.1、in/out1.4.2、mast…

《.NET 下最快比较两个文件内容是否相同》之我的看法验证

我对文件对比这一块还是比较感兴趣的&#xff0c;也想知道哪种方式性价比最高&#xff0c;效率最好&#xff0c;所以&#xff0c;根据这篇文章&#xff0c;我自己也自测一下&#xff0c;顺便留出自己对比的结果&#xff0c;供大佬们参考一二。 大致对比方案 我这边根据文章里…

循环队列(Ring Buffer)

背景&#xff1a; 最近在复习数据结构和算法&#xff0c;顺带刷刷题&#xff0c;虽然很长时间不刷题了但还是原来熟悉的味道&#xff0c;每一次重学都是加深了上一次的理解。本次我们看一下 循环队列(Ring Buffer)&#xff0c;C语言实现。 循环队列&#xff1a;首先 它是一个队…

chatgpt赋能python:Python安装好后怎么写代码?

Python安装好后怎么写代码&#xff1f; Python是一种高级编程语言&#xff0c;已成为众多开发者的首选工具。根据一些统计数据&#xff0c;Python排名全球第三的流行语言&#xff0c;已经成为Web开发、数据科学和人工智能领域的首选语言。如果您刚刚安装了Python&#xff0c;那…

【LeetCode全题库算法速练】6、N 字形变换

文章目录 一、题目&#x1f538;题目描述&#x1f538;样例1&#x1f538;样例2&#x1f538;样例3 二、代码参考 作者&#xff1a;KJ.JK &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &a…

YOLOv5/v7 添加注意力机制,30多种模块分析①,SE模块,SK模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、SE模块1、SE模块的原理2、代码实例3、实验结果4、应用示例&#xff08;1&#xff09;在 models/yolo.py 文件中定义 SEModule 类&#xff0c;用于实现SE模块。&#xff08;…

pyautogui实现自动连接GP VPN

支线小小项目(pyautogui实现自动连接GP VPN) 用了pyautogui做了一个懒人小脚本&#xff0c;主要是在家上班&#xff0c;每天要连公司vpn, 然后还要等好久&#xff0c;公司用的GP(global protect) VPN, 长这个样子 主要问题每次点击connect后需要等他先出来windows NT的login认…

Web安全总结

目录 网站架构一般web服务器结构相比于传统的网络攻击&#xff0c;基于web的攻击有什么不同&#xff1f;HTTP协议HTTP响应拆分攻击HTTPS针对HTTPS协议的攻击那么如何保证证书的唯一性&#xff1f; HTTP会话Cookie和Session的关系HTTP会话攻击解决方案 Web访问中的隐私问题Web应…

【读书笔记】《贫穷的本质》- [印度] Abhijit Banerjee / [法] Esther Duflo

文章目录 前言第一章 再好好想想第一部分 生活案例第二章 饥饿人口已达到10亿&#xff1f;第三章 提高全球居民健康水平容易吗&#xff1f;第四章 全班最优 前言 扶贫政策方面充斥着会取得立竿见影的效果的泡沫&#xff0c;事实证明这一点儿也不奇怪。要想取得进展&#xff0c;…

sed:命令讲解一

sed的使用&#xff1a; sed的使用 一、sed1.定义&#xff1a;2.工作流程&#xff1a;读取&#xff0c;执行&#xff0c;显示。3.基本操作格式&#xff1a;4.sed操作符&#xff1a;5.扩展&#xff1a; 一、sed 1.定义&#xff1a; 一种流编辑器&#xff0c;会在编辑器处理数据…

浅谈发改委强化电力需求侧管理缓解电力系统峰值压力方案设计 安科瑞 许敏

摘要&#xff1a;近年来全国用电负荷特别是居民用电负荷的快速增长&#xff0c;全国范围内夏季、冬季用电负荷“双峰”特征日益突出&#xff0c;恶劣气候现象多发增加了电力安全供应的压力。具有随机性、波动性、间歇性特征的可再生能源大规模接入电网对电力系统的稳定性带来新…

MySQL 索引及查询优化总结

一个简单的对比测试 前面的案例中&#xff0c;c2c_zwdb.t_file_count表只有一个自增id&#xff0c;FFileName字段未加索引的sql执行情况如下&#xff1a; 在上图中&#xff0c;typeall&#xff0c;keynull&#xff0c;rows33777。该sql未使用索引&#xff0c;是一个效率非常低…

chatgpt赋能python:Python安装HanLP:一个强大的NLP工具

Python安装HanLP&#xff1a;一个强大的NLP工具 HanLP是一个基于Python编写的神经网络自然语言处理工具&#xff0c;它提供给我们强大的文本处理和分析能力。在这篇文章中&#xff0c;我们将介绍如何在Python中安装并使用HanLP工具。如果你是一个文本处理和分析的爱好者或者工…

chatgpt赋能python:Python安装到U盘——实现随时随地的编程

Python安装到U盘——实现随时随地的编程 Python是一种广泛使用的动态解释型编程语言&#xff0c;简单易学&#xff0c;适用性广泛&#xff0c;被广泛应用于数据分析、Web开发、人工智能等领域。想要充分发挥Python的优势&#xff0c;随时随地进行编程&#xff0c;我们可以将Py…

人工智能正迎来量子飞跃——

光子盒研究院 6月1日&#xff0c;量子计算领域的行业领导者IonQ公布了其应用量子计算机模拟人类认知的一项早期研究结果。这篇论文描述了世界上第一个公开的方法&#xff1a;研究团队已将一个基本的人类认知模型在量子硬件上运行&#xff0c;这为模仿人类思维方式的改进决策模型…

Day_42哈希表

目录 一. 关于哈希表 二. 如何实现哈希表 1. 散列函数 2. 散列表 3. 散列函数的构造方法 4. 处理冲突的方法 三. 代码实现 1. 构造函数构造哈希表 2. 哈希表的查找 四. 代码展示 五. 数据测试​编辑 六. 总结 一. 关于哈希表 在前面介绍的线性表的查找中,记录在表中的位置…

RabbitMQ入门案例之Simple简单模式

RabbitMQ入门案例之Simple简单模式 前言什么是Simple模式Simple模式操作RabbitMQ管理界面的部分介绍 前言 本文将介绍RabbitMQ的七种工作模式的第一种Simple模式的代码实现&#xff0c;编程工具使用的是IDEA&#xff0c;在RabbitMQ中的工作模式都是生产消费模型 生产者消费模型…

Android系统的Ashmem匿名共享内存子系统分析(4)- Ashmem子系统的 Java访问接口

声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法&#xff0c;记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的&#xff0c;但因为我个人问题没能实施这个计划&#xff0c;留下些许遗憾…文中参考了很多书籍及博客内容&#xff0c;可能涉及的比较…

【云原生】Docker镜像的创建

1.Dokcer镜像的创建 创建镜像有三种方法&#xff0c;分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 1.1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改 docker run -it --name web centos:7 /…