我有一些由JavaScript HTML5网络音频API生成的数据.它生成Float32Array,一个32位浮点数组,介于-1和1之间.我使用websocket将数据流式传输到我的服务器.
我需要将32位浮点数转换为-32768和+32767(16位有符号整数)之间的16位PCM范围.然后,这允许将数据用作wav文件.
我在转换时遇到了麻烦.我怀疑答案是使用struct模块,但我无法获得正确的格式.
这是一个示例Python 2.7程序,它读取包含原始32位浮点音频样本的文件,并创建一个包含这些样本转换后的16位有符号整数样本的WAV文件:
import sys
import array
import struct
import wave
def convert(fin, fout, chunk_size = 1024 * 1024):
chunk_size *= 4 # convert from samples to bytes
waveout = wave.open(fout, "wb")
waveout.setparams((1, 2, 44100, 0, "NONE", ""))
while True:
raw_floats = fin.read(chunk_size)
if raw_floats == "":
return
floats = array.array('f', raw_floats)
samples = [sample * 32767
for sample in floats]
raw_ints = struct.pack("<%dh" % len(samples), *samples)
waveout.writeframes(raw_ints)
convert(open(sys.argv[1], "rb"), open(sys.argv[2], "wb"))
Run Code Online (Sandbox Code Playgroud)
该代码用于array.array将32位浮点样本转换为Python浮点数,因为它应该比它快一点struct.unpack.它也使用本机机器字节顺序,就像它一样Float32Array.不可能用于array.array创建16位整数样本,因为无论本机机器顺序如何,它们都需要使用小端字节顺序.范围转换由简单的Python代码处理.