JavaScript:UInt8Array转换为Float32Array

7

我有一些使用无符号8位PCM格式编码的音频缓冲区,需要通过仅支持有符号32位PCM格式的Web Audio进行播放。现在我有一些来自Uint8Array的pcm_u8数据分段的ArrayBuffer。如何将它转换为Float32Array?


也许术语“32位PCM”是错误的。事实上,我有一些无符号8位PCM音频缓冲区需要通过WebAudioAPI播放。正确的方法是什么?而MDN说它是32位浮点非交错PCM,然而... - Wilson Luniz
1
好的,所以你想要Float32Array。 - Jaromanda X
哦,好的,那我们来谈谈转换的问题吧~ - Wilson Luniz
https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer - Wilson Luniz
输入有多少个通道?输入的音频数据是否交错? - Jaromanda X
显示剩余3条评论
2个回答

15

从ECMAScript 2015开始,有一个TypedArray.from方法,可以将任何类型化数组(事实上,任何可迭代对象)转换为指定的类型化数组格式。

因此,将Uint8Array数组转换为Float32Array数组现在非常容易:

const intArray = new Uint8Array()
const floatArray = Float32Array.from(intArray)

1
Float32Array.from(uint8_array, octet => octet / 0xFF) 这就是我喜欢 Javascript 的原因。 - Константин Ван
1
这条评论被低估了 @КонстантинВан - undefined

13

这个函数将ArrayBuffer转换为Float32Array。

var convertBlock(buffer) { // incoming data is an ArrayBuffer
    var incomingData = new Uint8Array(buffer); // create a uint8 view on the ArrayBuffer
    var i, l = incomingData.length; // length, we need this for the loop
    var outputData = new Float32Array(incomingData.length); // create the Float32Array for output
    for (i = 0; i < l; i++) {
        outputData[i] = (incomingData[i] - 128) / 128.0; // convert audio to float
    }
    return outputData; // return the Float32Array
}

这个可以将 Uint8Array 转换为 Float32Array。

var convertBlock(incomingData) { // incoming data is a UInt8Array
    var i, l = incomingData.length;
    var outputData = new Float32Array(incomingData.length);
    for (i = 0; i < l; i++) {
        outputData[i] = (incomingData[i] - 128) / 128.0;
    }
    return outputData;
}

这个很好用!谢谢!我很好奇,float32 的范围大约是-3.4E+38到+3.4E+38,但WebAudioAPI只使用-1到+1。它是否限制了精度(只有32位的一部分)?还是我误解了什么? - Wilson Luniz
说实话,我不知道 - 但是范围为+/-1的float32并不是一个罕见的音频范围。 - Jaromanda X
使用超出[-1, 1]范围的值是未定义的。 - Esailija
在WebAudio图中,您可以使用全浮点范围来实现任何所需。但是,如果最终想要听到它,您必须以某种方式将其映射回+/-1的范围。在Chrome中,如果不这样做,您所有的值都会被强制截断为+/-1,从而导致您听到的信号失真。 - Raymond Toy
1
使用浮点数的原因是“范围”为-1 / +1是名义范围 - 也就是说,当您将其输出到扬声器时,它应该是[-1,+1],否则它会削波,但管道中其他音频信号可能远远超出该范围。 - cwilso
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接