2024-05-20 20:46:58 发布
网友
我有一些由javascript html5web音频api生成的数据。它生成Float32Array,一个32位浮点数组,介于-1和1之间。我使用websocket将数据流式传输到服务器。在
我需要把32位浮点转换成-32768到+32767(16位有符号整数)之间的16位PCM。这样就可以将数据用作wav文件。在
我无法转换。我怀疑答案是使用struct模块,但我无法获得正确的格式。在
下面是一个示例Python 2.7程序,它读取包含原始32位浮点音频样本的文件,并创建一个WAV文件,其中包含这些样本转换成的16位有符号整数样本:
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"))
代码使用array.array将32位浮点示例转换为Python浮点,因为它应该比struct.unpack快一点。它还使用本机字节顺序,就像Float32Array那样。不可能使用array.array来创建16位整数样本,因为它们需要使用little-endian字节顺序,而不考虑本机的顺序。范围转换由简单的Python代码处理。在
array.array
struct.unpack
Float32Array
下面是一个示例Python 2.7程序,它读取包含原始32位浮点音频样本的文件,并创建一个WAV文件,其中包含这些样本转换成的16位有符号整数样本:
代码使用
array.array
将32位浮点示例转换为Python浮点,因为它应该比struct.unpack
快一点。它还使用本机字节顺序,就像Float32Array
那样。不可能使用array.array
来创建16位整数样本,因为它们需要使用little-endian字节顺序,而不考虑本机的顺序。范围转换由简单的Python代码处理。在相关问题 更多 >
编程相关推荐