我有以下片段:
new Uint16Array( arraybuffer, 0, 18108 );
我知道
arraybuffer
是ArrayBuffer的一个实例,而arraybuffer.byteLength
是31984。arraybuffer的内容对我来说是一个黑盒子。因为缓冲区的 byteLength > 18108,所以我希望这能够正常工作。相反,我收到以下错误:
铬:
RangeError:类型化数组长度无效
火狐:
类型错误:无效参数
什么可能会导致失败,或者如何检查无法打开的 ArrayBuffer?
好吧,我误解了 TypedArray / Uint16Array 构造函数。第二个参数是
byteOffset
,但第三个参数是不是字节长度:它是元素长度。
来自 TypedArray 文档:
长度
当使用长度参数调用时,会在内存中创建一个内部数组缓冲区,其大小为 length 乘以包含 0 值的 BYTES_PER_ELEMENT 字节。
由于
Uint16Array.BYTES_PER_ELEMENT
为 2,数组缓冲区需要至少 2 * 18108
字节长,但事实并非如此。
我最近遇到了这个错误,所以我使用 ffmpeg 创建 wav 文件,所以我认为这是正确的格式。然后,你可以尝试用Python librosa或scipy打开并检查,我的问题是ffmpeg生成wav文件,但mp3layer格式,我需要转换为pcm格式。
当我尝试打开 200 个文件并从其 ArrayBuffer 部分获取一些数据时,我也遇到了同样的问题。 20 个文件总是会导致错误
RangeError: Invalid typed array length: 262144
所以我使用 ArrayBuffer.slice(startByte, endByte)
解决了它
所以这个
new Int16Array( arraybuffer, byteOffset, byteLength/2 )
改成这样
new Int16Array( arraybuffer.slice( byteOffset, byteOffset + byteLength ) )
但是
slice
它创建了新的ArrayBuffer,所以你不能更改创建该数组的arraybuffer