将16位字节数组读入整数而不截断

2024-10-02 22:31:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个I2S麦克风连接到一个微控制器,并成功地将16位音频WAV音频转储到一个python bytearray对象,该对象如下所示(使用micropython library):

raw = bytearray(b"\xac\xffW\x00\xfc\xfe\xac\xffs\xfe\xfc\xfe+\xfes\xfe7\xfe+\xfe\x8c\xfe7\xfe\x1f\xff\x8c\xfe\xcf\xff\x1f\xfft\x00\xcf\xff\xfb\x00t\x00?\x01\xfb...")

我已成功地将这些bytearray转储写入我创建的文件,如下所示:

wav = open('16bitaudio.wav','wb')
#....some code to write the wav header
wav.write(raw)
wav.close()

当我在电脑上打开它时,它会播放我忠实录制的样本,听起来很棒

我的问题来了-我想把这些数据转换成一个整数,它代表我样本中声音的平均强度。我首先尝试这样做:

intensity = sum(raw)/count(raw)

然而,这往往会导致几乎所有时间都有128个数字——这对我来说意味着它被读取为随机字节。经过进一步研究,这些数组函数似乎假设我们只有一个8位字节(读取值b'\xffW',我认为这是一个小的endian 22527):

>>> int(raw[1])
255

这似乎只是b'\xff'部分

我可以通过将字节解析为int.from_字节来获得期望值:

>>> int.from_bytes(b'\xffW','little')
22527

但是,如果不将bytearray截断为8位,我似乎无法遍历它

最后,我已经阅读了struct.unpack方法-看起来还可以,但我不确定bytearray是否包含长度一致的字节。。。。e、 g:

>>> len(bytearray(b'\xfdo\xfe\x7f\xfd\xd3\xf1d'))
8

尽管我只看到了6个字节。解包的最终问题是我不确定每个字节是提前8位还是提前16位,所以我不知道在第二个参数中使用什么字母组合

因此,考虑到b字符串表示,python似乎确实知道字节的编码方式,但是我手头的普通数组函数似乎是从bytearray获取这些信息。我确信有一种python方法可以将这个bytearray解析为整数,但我就是找不到它

非常感谢您的帮助


Tags: 对象raw字节音频intwavx00xff