`THREE.AudioAnalyser` 音频分析

news2024/11/17 21:45:06

demo案例
在这里插入图片描述

THREE.AudioAnalyser 音频分析

入参 (Input Parameters):

  • audio: 一个 THREE.Audio 实例,代表要分析的音频。
  • fftSize: 快速傅里叶变换(FFT)的大小,用于确定分析的精度和频率分辨率。
  • smoothingTimeConstant: 平滑时间常数,用于控制分析结果的平滑程度。

出参 (Output):

THREE.AudioAnalyser 可能不直接返回出参,而是提供方法来获取分析结果,如频谱数据或波形数据。

方法 (Methods):

  • getFrequencyData(array): 将当前音频的频谱数据填充到提供的数组中。
  • getByteFrequencyData(array): 将当前音频的频谱数据(以字节形式)填充到提供的数组中。
  • getByteTimeDomainData(array): 将当前音频的波形数据(以字节形式)填充到提供的数组中。
  • start(): 开始音频分析。
  • stop(): 停止音频分析。

属性 (Properties):

  • analyser: 内部的 AnalyserNode 实例,用于执行音频分析。
  • frequencyBinCount: FFT 的大小,即频率仓的数量。
  • smoothingTimeConstant: 平滑时间常数的当前值。

demo 案例

<!DOCTYPE html>
<html lang="en">
<head>
    <title>three.js webaudio - visualizer</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <link type="text/css" rel="stylesheet" href="main.css">

    <!-- 顶点着色器 -->
    <script id="vertexShader" type="x-shader/x-vertex">
        varying vec2 vUv;

        void main() {
            vUv = uv;
            gl_Position = vec4(position, 1.0);
        }
    </script>

    <!-- 片段着色器 -->
    <script id="fragmentShader" type="x-shader/x-fragment">
        uniform sampler2D tAudioData;
        varying vec2 vUv;

        void main() {
            vec3 backgroundColor = vec3(0.125, 0.125, 0.125);
            vec3 color = vec3(1.0, 1.0, 0.0);
            float f = texture2D(tAudioData, vec2(vUv.x, 0.0)).r;
            float i = step(vUv.y, f) * step(f - 0.0125, vUv.y);
            gl_FragColor = vec4(mix(backgroundColor, color, i), 1.0);
        }
    </script>

</head>
<body>
<div id="overlay">
    <button id="startButton">Play</button>
</div>
<div id="container"></div>
<div id="info">
    <a href="https://threejs.org" target="_blank" rel="noopener noreferrer">three.js</a> webaudio - visualizer<br/>
    music by <a href="http://www.newgrounds.com/audio/listen/376737" target="_blank" rel="noopener">skullbeatz</a>
</div>

<script type="importmap">
    {
        "imports": {
            "three": "../build/three.module.js",
            "three/addons/": "./jsm/"
        }
    }
</script>

<script type="module">
    // 导入所需的模块
    import * as THREE from 'three';

    // 定义全局变量
    let scene, camera, renderer, analyser, uniforms;

    // 获取开始按钮并添加点击事件监听器
    const startButton = document.getElementById('startButton');
    startButton.addEventListener('click', init);

    // 初始化函数
    function init() {
        const fftSize = 128; // FFT 大小

        // 移除遮罩
        const overlay = document.getElementById('overlay');
        overlay.remove();

        // 获取容器元素
        const container = document.getElementById('container');

        // 创建渲染器
        renderer = new THREE.WebGLRenderer({ antialias: true });
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        container.appendChild(renderer.domElement);

        // 创建场景和相机
        scene = new THREE.Scene();
        camera = new THREE.Camera();

        // 创建音频分析器
        const listener = new THREE.AudioListener();
        const audio = new THREE.Audio(listener);
        const file = './sounds/376737_Skullbeatz___Bad_Cat_Maste.mp3';

        // 检查是否在 iOS 设备上运行
        if (/iPad|iPhone|iPod/g.test(navigator.userAgent)) {
            const loader = new THREE.AudioLoader();
            loader.load(file, function (buffer) {
                audio.setBuffer(buffer);
                audio.play();
            });
        } else {
            const mediaElement = new Audio(file);
            mediaElement.play();
            audio.setMediaElementSource(mediaElement);
        }

        // 创建音频分析器并设置数据纹理
        analyser = new THREE.AudioAnalyser(audio, fftSize);
        const format = (renderer.capabilities.isWebGL2) ? THREE.RedFormat : THREE.LuminanceFormat;
        uniforms = {
            tAudioData: { value: new THREE.DataTexture(analyser.data, fftSize / 2, 1, format) }
        };

        // 创建材质
        const material = new THREE.ShaderMaterial({
            uniforms: uniforms,
            vertexShader: document.getElementById('vertexShader').textContent,
            fragmentShader: document.getElementById('fragmentShader').textContent
        });

        // 创建几何体和网格
        const geometry = new THREE.PlaneGeometry(1, 1);
        const mesh = new THREE.Mesh(geometry, material);
        scene.add(mesh);

        // 监听窗口大小变化
        window.addEventListener('resize', onWindowResize);

        // 开始动画循环
        animate();
    }

    // 窗口大小变化时更新渲染器尺寸
    function onWindowResize() {
        renderer.setSize(window.innerWidth, window.innerHeight);
    }

    // 动画循环
    function animate() {
        requestAnimationFrame(animate);
        render();
    }

    // 渲染函数
    function render() {
        // 更新频谱数据
        analyser.getFrequencyData();
        uniforms.tAudioData.value.needsUpdate = true;
        renderer.render(scene, camera);
    }
</script>

</body>
</html>

本内容来源于小豆包,想要更多内容请跳转小豆包 》

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

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

相关文章

AI时代的GPU集群网络算力分析

浅谈GPU集群网络、集群规模和集群算力 引言在生成式AI&#xff08;GenAI&#xff09;和大模型时代&#xff0c;不仅需要关注单个GPU卡的算力&#xff0c;更要关注GPU集群的总有效算力。单个GPU卡的有效算力可以通过该卡的峰值算力来测算&#xff0c;例如&#xff0c;对于Nvidia…

【01-机器学习入门:理解Scikit-learn与Python的关系】

文章目录 前言Python与机器学习Scikit-learn简介Scikit-learn与Python的关系使用Scikit-learn进行机器学习结语前言 在当今的数据科学和人工智能领域,机器学习已经成为了一个不可或缺的组成部分。而对于那些刚刚踏入这一领域的新手来说,理解机器学习的基本概念和找到合适的工…

UDS报文传输的四种帧

ISO14229-1规定了26个诊断服务细节&#xff0c;也就是UDS诊断报文的细节。它只规定了各个服务每个字节的含义&#xff0c;它不关心底层到底是怎么传输的。 ISO15765-2规定了基于CAN总线进行UDS报文传输的细节&#xff08;包括四种帧&#xff09;。是在CAN总线传输的情况下&…

Vitis HLS 学习笔记--对于启动时间间隔(II)的理解

目录 1. II的重要性 2. 案例分析 3. 总结 1. II的重要性 在Vitis HLS&#xff08;High-Level Synthesis&#xff09;中&#xff0c;启动时间间隔&#xff08;II&#xff0c;Iteration Interval&#xff09;是一个非常关键的概念&#xff0c;对于实现高性能的硬件加速器设计…

SpanBert学习

SpanBERT: Improving Pre-training by Representing and Predicting Spans 核心点 提出了更好的 Span Mask 方案&#xff0c;也再次展示了随机遮盖连续一段字要比随机遮盖掉分散字好&#xff1b;通过加入 Span Boundary Objective (SBO) 训练目标&#xff0c;增强了 BERT 的性…

蓄能勃发,酷开科技携酷开系统“软硬结合”提升大屏实力

智慧大屏以全新媒体形态之姿在过去几年快速增长&#xff0c;截至去年上半年&#xff0c;国内联网电视总量覆盖达5.26亿&#xff0c;其中智能电视终端活跃量达3.22亿&#xff0c;在PC、Mobile流量增长已显疲态的背景下&#xff0c;大屏的高速发展意味着一个新的赛道的崛起&#…

程序员英语之Spring篇

spring.io/quickstart 本期课程讲解Spring官网的快速上手页面 官网地址 https://spring.io/quickstart Spring Quickstart Guide Spring 快速开始指南 Guide 指南 What you’ll build 接下来你将要构建的是什么&#xff1f; build 构建 You will build a classic “H…

Sectigo证书申请流程及价格介绍

Sectigo 是一家全球知名的数字证书颁发机构&#xff08;Certificate Authority, CA&#xff09;&#xff0c;自1998年起就开始提供 SSL 证书服务&#xff0c;是全球最早的 CA 机构之一。 一 Sectigo证书申请流程 1 确定证书类型 根据自身的需求确定证书的类型&#xff0c;一…

from_pretrained明明以及下载好模型,却突然不能加载了报错

本人报错&#xff1a;OSError: Error no file named model_index.json found in directory /home/xxx/我的python学习/textToImage/sdxl-turbo. 原因&#xff1a;路径错误导致无法加载模型的配置文件 pipe AutoPipelineForText2Image.from_pretrained("stabilityai/sdx…

Gopher的Rust第一课:Rust的那些事儿

要说这两年后端编程语言谁最火&#xff0c;Rust[1]说自己第二&#xff0c;没人敢说第一。Rust连续8年霸榜stackoverflow最受推崇的编程语言[2]&#xff0c;甚至被推特之父Jack Dorsey称为“完美的编程语言”&#xff1a; 注&#xff1a;最火&#xff1a;仅代表人气最旺&#xf…

算法刷题day46

目录 引言一、树的重心二、毕业旅行问题三、高精度乘法 引言 今天复习了一下高精度的所有模板&#xff0c;包括加法、减法、乘法、除法&#xff0c;因为自己当时在蓝桥杯的时候没有看出来那个题使用高精度&#xff0c;因为对于一个数的大小和一个数的长度&#xff0c;自己有时…

【FX110网】股市、汇市一年有多少个交易日?

事实上&#xff0c;作为交易者&#xff0c;重要的是要了解并非每天都是交易日。虽然金融市场在大多数工作日开放交易&#xff0c;但在某些特定情况下无法进行交易。这些非交易日可能因各种原因而发生&#xff0c;包括节假日、周末和市场休市。 通过随时了解假期、交易时间表和市…

报名 | Qt汽车及工业行业解决方案及实战训练 深圳站(5月15日 星期三)

加入我们的Qt技术培训&#xff0c;探索跨平台应用开发的无限可能&#xff01;本次培训将深入Qt框架&#xff0c;涵盖从基础概念到高级功能的全方位知识&#xff0c;无论您是刚入门的新手还是希望提升技能的资深开发者&#xff0c;都能在此找到适合自己的学习路径。通过实践案例…

《XR806开发板试用》硬件IIC驱动MPU6050

1.环境配置 总结一下遇到的问题&#xff1a; 1.需要修改配置文件中的文件路径 2.固件编译出现以下问题时&#xff0c;需要修改文件内容 2.工程目录结构 device/xradio/xr806/ohosdemo/car_demo └── src #源文件 └── main.c #主函数 └── mpu6050.c #驱动代码 └…

golang 流程控制

流程控制 一 if条件语句 1 if单分支 if条件表达式{ //条件表达式不建议写括号 if后一定要有空格与条件表达式分开 逻辑代码 /大括号一定要写不能省略 } 例如 var age int fmt.Println("请输入学生1年龄:") fmt.Scanln(&age) fmt.Println(&quo…

光伏并网逆变器IEEE 1547测试

光伏并网逆变器IEEE 1547测试 IEEE 1547A-2014 有电力系统的互连配电资源;修改件1 IEEE 1547.2-2008 IEEE 1547《分布式资源与电力系统互连用IEEE标准》应用指南 IEEE 1547-2003 有电力系统的互连配电资源 IEEE P1547/D08-2001 IEEE 1547-2018(Revision of IEEE Std 1547-…

凌恩病原微生物检测系统上线啦,助力环境病原微生物检测

病原微生物是指能够引起人类或动物疾病的微生物&#xff0c;包括病毒、细菌、真菌、衣原体和支原体等。病原微生物可以通过空气、体液等介质传播&#xff0c;危害人体健康&#xff0c;造成财产损失。因此&#xff0c;快速、准确地检测病原微生物对于疫情防控和保障人民生命健康…

C++之类与对象(1)

目录 一、面向对象的思想 二、类 2.1 类的引入 2.2 类的定义 2.3 类的访问限定符及封装 2.3.1 访问限定符 2.3.2 封装 2.3.3 类的作用域 2.3.4 类的实例化 2.4 this指针 一、面向对象的思想 在正式介绍类与对象之前我们首先先简单了解一下面向对象的思想&#xff0c;提到…

4G车牌识别如何实现低功耗AOV唤醒拍照?

车牌识别摄像机&#xff0c;一般的做法是有线方式&#xff0c;并且采用有线网络或者是RJ45网络&#xff0c;如果换个方式&#xff0c;比如在野外工地&#xff0c;矿场&#xff0c;需要识别一些车牌&#xff0c;上传到服务器平台&#xff0c;要考虑的是无线&#xff0c;无电&…

Mybatisplus LambdaQueryWrapper表达式使用DATE_FORMAT比较日期函数

背景&#xff1a; 最近遇到一个问题&#xff0c;数据库保存的日期字段是如下格式 但是我们需要比较的日期为 2020-08-01格式&#xff0c; 所以我们要将日期格式化 使用 Mybatisplus LambdaQueryWrapper的情况下可用下面的方式做参考 LambdaQueryWrapper<SysDicCode> la…