我试图将PCM流转换为可读的float32Array。我尝试使用以下方法进行转换
function parseHexString(str) {
var result = [];
while (str.length >= 8) {
int16 = parseInt(str.substring(0, 8), 16);
float32 = (int16 / 32767) - 1;
result.push(float32);
str = str.substring(8, str.length);
}
return result;
}
输入(int16)
\x86%\x03%>$\xb1#\x06#8"\xc0!E!\xc5 \xad \xa4 \x97 \xe4 \x1e!/!\x80!\xb5!\xcb!+"u"\x8e"\xd2"\xdd"\xa4"\x98"l"$"3">"<"\x8a"\xc4"\xd9"$#I#@#h#j#8#2#\t#\xbf"\xc1"\xcb"\xd3")#h#t#\x9c#\x8d#?#\x15#\xbb"("\xbc!*!w \r \xa3\x1f2\x1f\x13\x1f\xf1\x1e\xbe\x1e\xd3\x1e\xd4\x1e\xae\x1e\xb1\x1e\x81\x1e\x16\x1e\xda\x1d\x84\x1d\x19\x1d\xfa\x1c\xd2\x1c\x9c\x1c\xb4\x1c\xd0\x1c\xe5\x1cK\x1d\x9b\x1d\xb0\x1d\xd2\x1d\x9d\x1d\x0b\x1d\x90\x1c\xf3\x1bF\x1b\x02...
返回类似这样的内容
[NaN, NaN, -0.9929502243110446, -0.999603259376812, NaN, -0.99954222235786, NaN, -0.9929502243110446, NaN, -0.9929502243110446, NaN, -0.9929502243110446, NaN, -0.9929502243110446, NaN, -0.9929502243110446, NaN, NaN, -0.9929502243110446, NaN, -0.999664296395764, NaN, -0.999877925962096, NaN, NaN, -0.999908444471572, NaN, NaN, -0.999908444471572, NaN, NaN, -0.999877925962096, NaN, NaN,
我不知道为什么我会拿到NaN。任何人?我还不确定PCM流是否格式正确
答案 0 :(得分:1)
我很想在此错误 - 但我对网络套接字的使用遗憾地仅限于通过线路发送二进制数据作为无符号8位整数(而不是16位整数而不是直接发送直接发送32位浮点数) - 因此,在您的发送方确保您的数据适当地减少 - 请告诉我,如果您的代码建议,Web套接字是否处理16位整数。类似地,在插座的接收侧,您需要通过移位和拼接4个8位整数的实例来复苏32位浮点数。我在javascript中编写代码,在管道的两端执行这些步骤。幸运的是,javascript隐藏了这个拼接。以下是Web套接字如何以数组缓冲区的形式接收8位整数数组并将其转换为32位类型数组:
socket.binaryType = "arraybuffer";
socket.onmessage = function (e) {
if (e.data instanceof ArrayBuffer) {
var retrieved_buffer_obj = {};
retrieved_buffer_obj.buffer = new Float32Array(e.data);
// now do something with your new floats
}
}
你提到了流 - 在我的代码中,它在数据缓冲区的层面上运行,其中每个缓冲区只是流数据传输的一大部分。
答案 1 :(得分:0)
正如Scott所说,你需要设置websocket来为你提供阵列缓冲区。但是需要将WebSocket输出转换为Uint16Array,而不是Float32Array,然后使用我给你的代码将其转换为浮点数。