FileReader readAsArrayBuffer() 与本地 mp3 文件
FileReader readAsArrayBuffer() with a local mp3 file
我已经查看了与 FileReader 和 readAsArrayBuffer() 有关的所有类似问题,但没有任何运气。
我正在尝试使用网络音频 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);
我收到错误:"Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'."
所以我猜文件不是 Blob。我在网上看到的示例让用户上传他们自己的 mp3 文件。我怎样才能使它与本地 mp3 一起工作?
感谢您的指点!
在你的代码中,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
表示。这两个 APIs 还提供了一个选项来直接请求文件作为 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 和 readAsArrayBuffer() 有关的所有类似问题,但没有任何运气。
我正在尝试使用网络音频 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);
我收到错误:"Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'."
所以我猜文件不是 Blob。我在网上看到的示例让用户上传他们自己的 mp3 文件。我怎样才能使它与本地 mp3 一起工作?
感谢您的指点!
在你的代码中,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
表示。这两个 APIs 还提供了一个选项来直接请求文件作为 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));