javascript - JavaScript 中音频缓冲区的 HTML 文件输入

标签 javascript html forms web-audio-api

我正在努力编写一个简单的 HTML 页面,其中的表单将音频文件作为输入并将其传递给 JavaScript 文件进行操作。

我有什么

index.html

<html lang="en">
  <head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  </head>
  <body>
    <main role="main" class="container">
      <form action="#" method="POST" enctype="multipart/form-data" class="audio-input-form">
          <label>Audio File:</label>
          <input accept="audio/*" type="file" name="audio_file"/>
          <input type="submit" value="Get BPM" />
      </form>
    </main>
     <script type="text/javascript" src="app.js"></script>
  </body>
</html>

app.js

// Package from NPM I import
import { analyze } from 'web-audio-beat-detector';

## here I want to be able to get and manipulate the audio data

期望的结果

提交表单时,我只想在 JavaScript 文件中提供实际的文件数据(我猜是一个数组缓冲区)。我希望使用 this tutorial 将其转换为 AudioBuffer 但我不清楚如何实际传递数据。

我尝试将表单操作作为我的 JS 文件中的函数,并使用 onClick 函数,但似乎都不起作用。我需要某种形式的 XHR 吗?我对它们的目的感到困惑,我不希望为此运行任何类型的服务器,只需要一个 HTML 页面和一个在浏览器中与其一起运行的 JavaScript 文件。

最佳答案

我创建了一个甚至不使用表单的小示例。如果您只有一个输入,您可以监听其 onchange 事件。这至少对于本演示的目的是有效的。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <input id="audio-file" accept="audio/*" disabled type="file"/>
        <script>
            import('https://dev.jspm.io/web-audio-beat-detector')
                .then(({ default: { analyze }}) => {
                    const $audioFileInput = document.getElementById('audio-file');

                    $audioFileInput.disabled = false;
                    $audioFileInput.onchange = async () => {
                        const file = $audioFileInput.files[0];

                        if (file !== undefined) {
                            $audioFileInput.disabled = true;

                            const arrayBuffer = await file.arrayBuffer();
                            const audioContext = new AudioContext();
                            const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);

                            alert(await analyze(audioBuffer));

                            $audioFileInput.disabled = false;
                        }
                    };
                });
        </script>
    </body>
</html>

我还通过 jspm.io 加载了 web-audio-beat- detector 但在真实的应用程序中,您可能希望将其与 webpack 之类的东西捆绑在一起。

每次想要解码一些音频数据时创建一个 AudioContext(就像我在这里所做的那样)是非常浪费的。如果您计划解码多个文件,那么重用一个 AudioContext 会更有意义。

另请注意,我仅在最新版本的 Firefox 和 Chrome 中对此进行了测试。不幸的是,它在 Safari 中不起作用。让它在 Safari 中工作需要更多的代码,这就是我省略它的原因。

关于javascript - JavaScript 中音频缓冲区的 HTML 文件输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59180408/

相关文章:

javascript - 在 Google Scripts 中将 JS 变量传递给 HTML

security - 在提交之前,如何确保 HTML 表单的元素没有被更改以在客户端进行黑客攻击?

JavaScript 弹出 : Invoking in JQuery

javascript - 无法将变量传递给 header (XMLHttpRequest)

html - 尝试使用具有相同类的 sass 为 div 中的第一个 <p> 元素设置样式

javascript - 将值从一个表单字段复制到另一个表单字段(不带复选框)

javascript - 如何在复选框中使用输入类型进行同步日志

javascript - GridLayout ListView 的渲染非常慢 - WinJS

javascript - 在 jQuery 的特定页面上加载和初始化多个 JS 插件

html - 当第一个没有固定长度时如何将div放在一边div