【问题标题】:FileReader readAsArrayBuffer() with a local mp3 fileFileReader readAsArrayBuffer() 与本地 mp3 文件
【发布时间】:2017-09-21 23:10:33
【问题描述】:

我已经查看了与 FileReader 和 readAsArrayBuffer() 相关的所有类似问题,但没有任何运气。

我正在尝试使用 Web Audio API 读取本地 mp3 文件并使用 FileReader 对其进行处理,以便将其用于某些音乐可视化。

这是我目前拥有的:

    var file = "../../audio/magic_coldplay.mp3";
    var fileReader = new FileReader();

    fileReader.onload = function (e) {
            var fileResult = e.target.result;
            visualizer.start(fileResult);
    };

    fileReader.onerror = function (e) {
        debugger
    };

    fileReader.readAsArrayBuffer(file);

我收到错误:“无法在 'FileReader' 上执行 'readAsArrayBuffer':参数 1 不是 'Blob' 类型。”

所以我猜文件不是 Blob。我在网上看到的示例让用户上传自己的 mp3 文件。如何使用本地 mp3 进行这项工作?

感谢您的指点!

【问题讨论】:

  • 你叫什么本地?在你的服务器上?所以是的file这里是一个字符串,远离文件或Blob...如果这个字符串表示指向文件的有效URI,那么你可以做fetch(file).then(r=>r.blob()).then(blob=>fileReader.readAsArrayBuffer(blob))
  • 是的,在我的服务器上,现在在本地运行。
  • 所以是的,首先获取数据,但实际上,直接将其作为arrayBuffer 获取,甚至不通过fileReader。 (当我的手回到真正的键盘上时,我可能会写一个答案)
  • 成功了!所以,只是为了让我了解发生了什么——您正在获取文件字符串,将其转换为 blob,然后将其作为数组缓冲区读取? “甚至不通过 fileReader”是什么意思谢谢!!

标签: javascript web filereader web-audio-api


【解决方案1】:

在您的代码中,file 是一个字符串,最好将其重命名为url; FileReader 不知道如何处理字符串,因此会抛出您遇到的错误。

由于这个字符串是一个指向文件的 URI,你要做的就是从 URI 的另一端获取数据。

为此,您至少有两个类似的 API:传统的 XHR 和更新的 Fetch

这两个 API 都允许您将文件作为 Blob 请求,以便您可以在获取后将其与 FileReader API 一起使用:

// traditional XHR
var xhr = new XMLHttpRequest();
xhr.open('get', url);
xhr.responseType = 'blob'; // we request the response to be a Blob
xhr.onload = function(e){
  fileReader.readAsArrayBuffer(this.response);
}
xhr.send();

// or newer Fetch
fetch(url)
  .then(resp => resp.blob())
  .then(blob => fileReader.readAsArrayBuffer(blob));

但在你的情况下,你需要的是这个文件的ArrayBuffer 表示。这两个 API 还提供了直接以 ArrayBuffer 请求文件的选项,从而使 FileReader 无用:

// traditional XHR
var xhr = new XMLHttpRequest();
xhr.open('get', url);
xhr.responseType = 'arraybuffer'; // directly as an ArrayBuffer
xhr.onload = function(e){
  visualizer.start(this.response); // no need to use a FileReader anymore
}
xhr.send();

// or newer Fetch
fetch(url)
  .then(resp => resp.arrayBuffer()
  .then(buf => visualizer.start(buf));

【讨论】:

  • 这应该放在 fileReader.onload = function (e) 下面吗?我试图弄清楚 fileResult 等于什么
  • 实际上 - 明白了。 Visualizer.start(buf) 有效 - 听起来对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 2018-09-17
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多