【发布时间】:2018-03-20 07:35:50
【问题描述】:
我有一个来自 decodeAudioData 方法的 float32Array,我想将它转换为 Uint8Array,同时保留 float32 IEEE 754 音频数据。
到目前为止我试过了,
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;
编辑:
我只需要保留二进制表示,就像在 answer. 中一样
【问题讨论】:
-
为什么不将
Uint8Array映射到同一个缓冲区?那么你就不必复制任何东西了。 -
你也没有真正描述你的代码有什么问题。出了什么问题?是否报告了错误?
-
@Pointy 你能多解释一下映射吗?以这种方式保留 IEEE 754 表示是否可行?
-
如果您可以在输入和输出数组中添加特定的输入和输出数值,这将非常有帮助。
-
我注意到您正在使用音频缓冲区,这意味着您的值将在浮动的 [1,-1] 之间。如果将其直接转换为 8 位类型,则只会在此范围内获得 2 或 3 个数字(-1,0 和 1 取决于舍入和符号)。您是否尝试将数据转换为文件格式存储,例如 8 位 16 位音频?在这种情况下,您需要将数字缩放到这些格式所代表的区间。没有办法将浮点表示中的实际 数字 保留为 8 位数字,除非它们恰好是 [0,255] 或有符号的 [-128,127] 整数。
标签: javascript ieee-754 typed-arrays