2014-06-05 65 views
1

我试图将PCM流转换为可读的float32Array。我想用下面的方法转换将PCM流转换为Javascript可读流

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数据流的格式是否正确

+1

您输入的内容并不太清楚 –

+0

我以int16格式从Python应用程序接收PCM输入,并通过websocket连接将其发送到浏览器 – boortmans

回答

1

我很想误会这一点 - 但是我的网络套接字的使用令人遗憾,仅限于通过网络发送二进制数据作为无符号的8位整数(不是16位整数,直接发送32位浮点数就没有任何意义) - 所以在发送方保证你的数据被适当地减少 - 请告诉我,如果你的代码表明网络套接字处理16位整数。同样在插座的接收端,您需要将32位浮点数从移位和拼接在一起的4个8位整数实例中复苏。我在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 

    } 
} 

你提到流 - 在我的代码是在一个级别上操作数据缓冲区,其中每个缓冲区只是您的流式数据传输的一部分。

0

正如Scott所说,您需要设置websocket来为您提供阵列缓冲区。但需要将WebSocket输出转换为Uint16Array,而不是Float32Array,然后使用我给您的代码将其转换为浮点。