我有一个来自decodeAudioData方法的decodeAudioData,我想把它转换成Uint8Array,而保存float32 IEEE754音频数据。
到目前为止我试过了,
var length = float32Array.length;
var emptyBuffer = new ArrayBuffer(length * 4);
var view = new DataView(emptyBuffer);
for (var i = 0; i < length; i++) {
view.setFloat32(i * 4, float32Array[i], true);
}
var outputArray = new Uint8Array(length);
for (var j = 0; j < length; j++) {
outputArray[j] = view.getUint8(j * 4);
}
return outputArray;
编辑:
我只需要保持二进制表示,就像在这个回答。中一样
发布于 2018-03-19 23:35:50
var output = new Uint8Array(float32Array.length);
for (var i = 0; i < float32Array.length; i++) {
var tmp = Math.max(-1, Math.min(1, float32Array[i]));
tmp = tmp < 0 ? (tmp * 0x8000) : (tmp * 0x7FFF);
tmp = tmp / 256;
output[i] = tmp + 128;
}
return output;
任何有疑问的人都可以很容易地用胆量的进口原始数据特性来测试这个问题。
forceDownload(new Blob([output], { type: 'application/octet-binary' }));
发布于 2018-03-18 18:05:07
不太清楚你在问什么,或者更确切地说,你要求的似乎是一件毫无意义的事情。
Float32Array
实例是“原始”字节值缓冲区上的视图,与所有类型化数组一样。数组的每个元素表示其中的4个原始字节。通过简单的数组查找提取值:
var n = float32array[1];
隐式地将这4个字节解释为IEEE 32位浮点值,然后将该值转换为标准JavaScript数字。JavaScript数字总是64位IEEE浮点值.
类似地,Uint8Array
是缓冲区上的视图,每个元素都提供一个字节的无符号整数值。那是,
var n = uint8array[1];
访问该元素,将其解释为一个无符号的单字节整数,并将其转换为JavaScript数字。
因此:如果要检查32位浮点值的列表作为每个字节的原始整数值,则可以创建与Float32Array
“共享”相同缓冲区的Float32Array
。
var uintShared = new Uint8Array(float32array.buffer);
从查看Uint8Array
值中看到的数字值似乎与查看Float32Array
元素所获得的数字值没有任何关系,这是预期的。
另一方面,如果您想要创建一个新的Uint8Array
来保存来自Float32Array
的表观值,您只需创建一个长度相同的新数组并复制每个值:
var uintCopy = new Uint8Array(float32array.length);
for (let i = 0; i < float32array.length; ++i)
uintCopy[i] = float32array[i]; // deeply problematic; see below
通常情况下,这将不能很好地工作,因为Float32Array
中的数值范围远远大于Uint8Array
中值的数值范围。首先,32位浮点值可以是负值.更重要的是,即使你知道浮点值都是0到255之间的整数,你肯定不会在Uint8Array
中得到相同的位模式,原因很简单,一个32位浮点数和一个8位无符号整数不一样。“保留IEEE-754表示”是没有意义的。
这就是现实情况。如果你要解释为什么你想以某种方式把32位IEEE浮点数的所有32位塞进一个8位的无符号整数中,那就有可能提供一个更直接的有帮助的答案。
https://stackoverflow.com/questions/49348743
复制相似问题