Python 将32位浮点转换为16位PCM范围

Python 将32位浮点转换为16位PCM范围,python,audio,Python,Audio,我有一些由javascript HTML5 web音频api生成的数据。它生成一个32位浮点数组,介于-1和1之间。我使用websocket将数据流传输到服务器 我需要将32位浮点转换为-32768和+32767(16位有符号整数)之间的16位PCM范围。这样就可以将数据用作wav文件 我在转换上有困难。我怀疑答案是使用struct模块,但我无法获得正确的格式。下面是一个示例Python 2.7程序,它读取包含原始32位浮点音频样本的文件,并创建一个WAV文件,其中包含转换为16位有符号整数样本

我有一些由javascript HTML5 web音频api生成的数据。它生成一个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"))
导入系统 导入数组 导入结构 输入波 def转换(fin、fout、块大小=1024*1024): 块大小*=4#从样本转换为字节 waveout=波浪开启(fout,“wb”) setparams((1,244100,0,“无”和“”) 尽管如此: 原始浮点数=fin.read(块大小) 如果原始_浮动==“”: 返回 浮点数=数组。数组('f',原始浮点数) 样本=[sample*32767 对于漂浮物中的样品]
原始整数=结构包("
struct
模块无法在这些类型之间直接转换。它只能将32位浮点值解压为Python浮点值,并将Python int打包为16位整数。它也不会进行您需要的范围转换。感谢您的帮助。我已将代码简化为:,但当我使用此处定义的字节时:我得到错误
struct.error:此时必需的参数不是整数
示例看起来像这样,例如,
[505.00430237688124487.5382216461003471.0005183443427440.09429602883756]
,这很有意义,因为
示例
是一个浮动列表still@rikAtee您使用的是哪一版本的Python?3.5.2在另一个注释中,当我添加以下内容时,我认为它开始表现自己:
samples=[int(sample*32767)用于float中的sample]
Yah,我使用的是2.7,它似乎没有那么挑剔。使用
int(示例*32767)
应该可以解决这个问题。