![](/img/trans.png)
[英]Why Int16Array to ArrayBuffer convert back Int16Array, result is different?
[英]How to convert Blob to Int16Array
我在Blob中有一个WAV文件,为了将其转换为MP3,我需要先将其转换为Int16Array(以遵循此处的示例: https : //github.com/zhuker/lamejs )。
例如
var mp3encoder = new lamejs.Mp3Encoder(2, 44100, 128);
// instead of `var samples = new Int16Array(44100);` I want something like `var samples = new Int16Array(blob);`
var mp3Tmp = mp3encoder.encodeBuffer(samples);
这可能吗?
如果您知道数据实际上是16位int
的blob,那么可以,这是可能的:
通过FileReader
的readAsArrayBuffer
( spec , MDN )将Blob
读取到ArrayBuffer
。
const fr = new FileReader(); fr.readAsArrayBuffer(samples);
ArrayBuffer
在FileReader
的result
属性或onload
回调参数的event.target.result
属性上可用(请参见下文)。
查看ArrayBuffer
作为Int16Array
通过Int16Array
构造函数:
const data = new Int16Array(fr.result);
现在, data
是Blob中的数组缓冲区,被视为Int16Array
。
遵循以下原则:
const fr = new FileReader();
fr.onload = () => {
// It worked
const array = new Int16Array(fr.result);
// ...use the array here...
};
fr.onerror = () => {
// The read failed, handle/report it
};
fr.readAsArrayBuffer(samples);
如果要在请求之间重用负载完成处理程序,则可以接受event
参数并使用event.target.result
而不是fr.result
:
function loaded(event) {
const array = new Int16Array(event.target.result);
// ...use the array here...
}
// ...
fr.onload = loaded;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.