如何编写基于网络的音乐可视化工具?

2024-02-27

我正在尝试找到构建音乐可视化工具以在网络浏览器中运行的最佳方法。 Unity 是一个选项,但我需要构建一个自定义音频导入/分析插件来获取最终用户的声音输出。 Quartz 可以满足我的需要,但只能在 Mac/Safari 上运行。 WebGL 似乎还没有准备好。 Raphael 主要是 2D,并且仍然存在获取用户声音的问题......有什么想法吗?以前有人这样做过吗?


让音频响应起来非常简单。这是一个开源网站,其中有很多音频反应示例 https://www.vertexshaderart.com.

至于如何做到这一点,您基本上使用 Web Audio API 来传输音乐并使用其 AnalyserNode 来获取音频数据。

"use strict";
const ctx = document.querySelector("canvas").getContext("2d");

ctx.fillText("click to start", 100, 75);
ctx.canvas.addEventListener('click', start);  

function start() {
  ctx.canvas.removeEventListener('click', start);
  // make a Web Audio Context
  const context = new AudioContext();
  const analyser = context.createAnalyser();

  // Make a buffer to receive the audio data
  const numPoints = analyser.frequencyBinCount;
  const audioDataArray = new Uint8Array(numPoints);

  function render() {
    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);

    // get the current audio data
    analyser.getByteFrequencyData(audioDataArray);

    const width = ctx.canvas.width;
    const height = ctx.canvas.height;
    const size = 5;

    // draw a point every size pixels
    for (let x = 0; x < width; x += size) {
      // compute the audio data for this point
      const ndx = x * numPoints / width | 0;
      // get the audio data and make it go from 0 to 1
      const audioValue = audioDataArray[ndx] / 255;
      // draw a rect size by size big
      const y = audioValue * height;
      ctx.fillRect(x, y, size, size);
    }
    requestAnimationFrame(render);
  }
  requestAnimationFrame(render);

  // Make a audio node
  const audio = new Audio();
  audio.loop = true;
  audio.autoplay = true;

  // this line is only needed if the music you are trying to play is on a
  // different server than the page trying to play it.
  // It asks the server for permission to use the music. If the server says "no"
  // then you will not be able to play the music
  // Note if you are using music from the same domain 
  // **YOU MUST REMOVE THIS LINE** or your server must give permission.
  audio.crossOrigin = "anonymous";

  // call `handleCanplay` when it music can be played
  audio.addEventListener('canplay', handleCanplay);
  audio.src = "https://twgljs.org/examples/sounds/DOCTOR%20VOX%20-%20Level%20Up.mp3";
  audio.load();


  function handleCanplay() {
    // connect the audio element to the analyser node and the analyser node
    // to the main Web Audio context
    const source = context.createMediaElementSource(audio);
    source.connect(analyser);
    analyser.connect(context.destination);
  }
}
canvas { border: 1px solid black; display: block; }
<canvas></canvas>

然后就由你来画一些有创意的东西了。

请注意您可能会遇到的一些麻烦。

  1. 目前(2017/1/3)Android Chrome 和 iOS Safari 均不支持分析流式音频数据。相反,您必须加载整首歌曲。这是一个试图抽象一点的库 https://github.com/greggman/audiostreamsource.js

  2. On Mobile you can not automatically play audio. You must start the audio inside an input event based on user input like 'click' or 'touchstart'.

  3. 正如示例中所指出的,只有当源来自同一域或者您请求 CORS 权限并且服务器授予权限时,您才能分析音频。据我所知,只有 Soundcloud 给予许可,并且是按每首歌为基础的。是否允许对特定歌曲进行音频分析取决于各个艺术家的歌曲设置。

    尝试解释这部分

    默认情况下,您有权访问同一域的所有数据,但没有其他域的权限。

    当你添加

    audio.crossOrigin = "anonymous";
    

    这基本上就是“向服务器请求用户‘匿名’的许可”。服务器可以授予权限,也可以不授予权限。这取决于服务器。这包括询问同一域上的服务器,这意味着如果您要请求同一域上的歌曲,您需要 (a) 删除上面的行或 (b) 配置您的服务器以授予 CORS 权限。默认情况下,大多数服务器不授予 CORS 权限,因此如果添加该行,即使服务器是同一域,如果它不授予 CORS 权限,则尝试分析音频将失败。


music: VOX 博士 - 升级 http://youtu.be/eUX39M_0MJ8

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写基于网络的音乐可视化工具? 的相关文章

  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 在 Chrome 18 中检测 SwiftShader WebGL 渲染器

    我有一个 2D HTML5 游戏引擎 www scirra com http www scirra com 并且确实想检测 WebGL 是否将使用 Chrome 18 的 Swiftshader 软件渲染器进行渲染 如果是这样我们会much
  • 在unity3D中显示数学方程

    我想使用它的 GUI 系统统一显示数学方程 有办法吗 我正在使用 C 语言在 Unity 中进行编程 如果我还可以使用 C 代码显示数学符号 这对我来说会很有用 谢谢 自 2016 年起 您可以使用TEXDraw https assetst
  • 如何使用 Unity 在 Android 设备上以各种宽高比显示游戏的相同部分?

    我从 Libgdx 引擎转向 Unity 是一名初级程序员 我尝试在 Unity 中为 Android 和 iOS 设备制作游戏 但在宽高比 分辨率缩放方面遇到问题 在 Libgdx 中 如果您开发了一些东西 您可以指定 默认 分辨率 并且
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • 将旧的 Unity 代码升级到 Unity 5

    在触发按钮上播放动画的代码似乎不起作用 我在 Youtube 上看到了一个视频 内容很简单animation Play 它可以在该视频上运行 但我无法让它在我的计算机上运行 我做错了什么还是团结改变了它 请帮助我在网上找不到解决方案 所有
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • Unity遥控器5不工作

    我尝试运行 Unity Remote 但是当我在 Unity 编辑器中按下播放时 我的手机上没有任何反应 我认为我需要做的不仅仅是将手机与电脑连接 将编辑器设置为任何 Android 设备并按开始键 但这些是它所说的唯一内容 它根本不起作用
  • 从 UnityWebGL jslib 返回字符串

    我想使用 jslib 来获取网址参数 像这样的代码 jslib GetUrl function var s var strUrl window location search var getSearch strUrl split var g
  • 我可以在 WebGL 的 GLSL 中使用什么作为数组索引?

    是否只允许使用常量 或者我可以将其用于循环索引或任何其他动态值 In WebGL GLES2 是的 只允许使用常量 但是 如果您的代码可以展开 无论是由您自己还是由编译器 那么它就被视为一个常量 并且您有一个解决方法 例如 问题 unifo
  • 与整数纹理进行 Alpha 混合以进行对象拾取

    问题描述 你好 在我们的 WebGL 应用程序中 我们正在绘制许多 甚至数十万 形状 并且我们想要发现当前鼠标位于哪个形状 我正在寻找一种有效的方法 Details 形状定义为有符号距离函数 https en wikipedia org w
  • 如何从 mysql 数据库中提取数据并使用 D3.JS 进行可视化?

    我有一个数据库MySQL我想在其中可视化D3 JS 为了做到这一点 首先我想parse中的数据JSON格式 然后编写一个基本代码 从数据库中提取数据并使用D3 JS 我环顾四周 但找不到我想要的东西 因为我是新手D3 JS 我怎样才能做到这
  • OpenGL ES 中的高效绘图方法

    在我的应用程序中 我通过 OpenGL ES Api 绘制了很多立方体 所有立方体的尺寸相同 只是它们位于空间坐标不同 我可以想到两种绘制它们的方法 但我不确定哪一种是最有效的 我不是OpenGL专家 所以我决定在这里问 方法1 这就是我现
  • Unity IAP 无法在 Apple Testflight 中工作

    过去几天尝试让 IAP 在我的第一个游戏应用程序的 TestFlight 上运行时遇到问题 IAP 在 Unity Editor 假商店 和 Google Play 内部测试轨道 上运行良好 我没有从苹果商店收到任何产品价格 并且购买按钮没
  • 为什么旋转 3D 点云后顶点法线会翻转?

    我有两个人脸 3D 点云样本 蓝色点云表示目标面 红色点云表示模板 下图显示目标面和模板面在不同方向上对齐 目标面大致沿 x 轴 模板面大致沿 y 轴 Figure 1 The region around the nose is displ
  • Facebook Unity Sdk v5.0.3 尝试登录时在横向模式下崩溃 - Android

    当我在横向模式下单击登录按钮时 游戏崩溃 如果我使用纵向模式 一切都会正常工作 当我崩溃时 我从 bugsense 得到了以下堆栈跟踪 java lang RuntimeException Unable to start activity
  • Unity C# 嵌套 IEnumerator

    在我的代码中 我嵌套了 IEnumerator 方法 如下所示 private IEnumerator PerformRequest string url Doing stuff UnityWebRequest request UnityW
  • WebGL VS Canvas 2D 硬件加速

    这些天 我需要在画布上画很多图像 画布尺寸为800x600px 我有很多256x256px的图像 有些更小 在上面绘制 这些小图像将在画布上组成一个完整的图像 我有两种方法来实现这一点 首先 如果我使用canvas 2D上下文 那就是con
  • Unity 检查 Toggle 是否打开

    我正在检查开关是否打开 通常我使用public Toggle myToggle在检查器中 但这我将脚本附加到Toggle并且可能错误地使用GetComponent
  • 从剪贴板读取文本

    我正在尝试在 Unity 中使用 C 读取剪贴板中的文本 然后将其设置为变量 我看过这篇文章 但它似乎在 Unity 中不起作用 https learn microsoft com en us dotnet api system windo

随机推荐