`THREE.AudioAnalyser` 音频分析

ops/2024/9/25 19:15:03/

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.ppmy.cn/ops/14928.html

相关文章

vlan的学习笔记2(vlan间通信)

1.使用路由器的物理接口 原理&#xff1a;在二层交换机上配置VLAN&#xff0c;每个VLAN单独使用一个交换机接口与路由器互联。路由器使用两个物理接口&#xff0c;分别作为VLAN 10及VLAN 20内PC的默认网关&#xff0c;使用路由器的物理接口实现VLAN之间的通信。 实验1&#x…

K8S 部署和访问 Kubernetes 仪表板(Dashboard)

文章目录 部署 Dashboard UI浏览器访问登陆系统 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览…

使用git将本地项目上传到github

大致的流程是&#xff1a;创建本地仓库&#xff0c;把代码传到本地仓库&#xff0c;把本地仓库内容传到远程仓库。还不太完整&#xff0c;逐渐摸索使用吧 1、初始化仓库 git init在本地项目的路径中初始化一个仓库。 2、提交到本地 选择需要上传的文件 git add .提交到本地…

树形dp,LeetCode 2385. 感染二叉树需要的总时间

一、题目 1、题目描述 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟&#xff0c;感染 将会从值为 start 的节点开始爆发。 每分钟&#xff0c;如果节点满足以下全部条件&#xff0c;就会被感染&#xff1a; 节点…

解锁无限资源:用爬虫玩转石墨文档

石墨文档作为一款在线协作编辑工具&#xff0c;汇集了大量的优质文档资源。然而&#xff0c;有时我们需要更多、更广泛的资源&#xff0c;这时候&#xff0c;利用爬虫技术就能轻松获取到我们需要的文档。本文将详细介绍如何利用爬虫玩转石墨文档&#xff0c;解锁无限资源的奥秘…

第十五届蓝桥杯题解-好数

题目大意&#xff1a;一个数的低位为奇数&#xff0c;次低位为偶数&#xff0c;以此类推的数成为好数&#xff0c;例如&#xff1a;1&#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;9 给定一个n&#xff0c;求1-n所有好数的个数&#xff0c;n<1e7 思路&#xff1a;一…

idm序列号永久激活码2023免费可用 IDM软件破解版下载 最新版Internet Download Manager 网络下载加速必备神器 IDM设置中文

IDM是一款多线程下载工具&#xff0c;全称Internet Download Manager。IDM的多线程加速功能&#xff0c;能够充分利用宽带&#xff0c;所以下载速度会比较快&#xff0c;而且它支持断点续传。它的网站音视频捕获、站点抓取、静默下载等功能&#xff0c;也特别实用。 idm使用技…

【网络安全】网络安全协议和防火墙

目录 1、网络层的安全协议&#xff1a;IPsec 协议族 &#xff08;1&#xff09;IP 安全数据报格式 &#xff08;2&#xff09;互联网密钥交换 IKE (Internet Key Exchange) 协议 2、运输层的安全协议&#xff1a;TLS 协议 3、系统安全&#xff1a;防火墙与入侵检测 1、网络…