I've looked at all the similar questions having to do with FileReader and readAsArrayBuffer() but haven't had any luck.
I'm trying to use the Web Audio API to read in a local mp3 file and process it with FileReader in order to use it for some music visualization.
This is what I have currently:
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);
I'm getting the error: "Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'."
So I guess file isn't a Blob. The examples I've seen online have the user uploading their own mp3 file. How can I make this work with a local mp3?
thanks for any pointers you may have!
readAsArrayBuffer() The FileReader interface's readAsArrayBuffer() method is used to start reading the contents of a specified Blob or File . When the read operation is finished, the readyState becomes DONE , and the loadend is triggered.
What does readAsArrayBuffer return? Returns partial Blob data representing the number of bytes currently loaded (as a fraction of the total), as an ArrayBuffer object, a fixed-length binary data buffer.
In your code, file
is a String, which would be better renamed url
; FileReader doesn't know what to do with a String and thus will throw the error you've got.
Since this string is an URI pointing to a file, what you have to do is to fetch the data at the other hand of the URI.
For this, you've got at least two similar APIs: traditional XHR
and more recent Fetch
.
Both these APIs allow you to request the file as a Blob, so that you can use it with the FileReader API once fetched:
// 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));
But in your case, what you need is the ArrayBuffer
representation of this file. Both these APIs also provide an option to directly request the file as an ArrayBuffer
, making the FileReader useless:
// 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));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With