波形文件如何存储多个通道?

时间:2010-06-04 19:29:10

标签: python audio wave

我使用Audacity创建了两个wave文件。两者都有44100hz采样率,32位浮点样本,保存为WAV(微软)16位签名并包含1s沉默(根据Audacity)。区别在于一个文件包含一个通道,而另一个文件包含两个(立体声)。当阅读一个频道文件时,我得到了这样的帧:

0x00 0x00  
...  ...  

正如预期的那样,但在阅读我得到的第二个文件时:

0x00 0x00 0x00 0x00  
0x01 0x00 0xff 0xff  
0x00 0x00 0x00 0x00  
0x00 0x00 0x01 0x00  
0xff 0xff 0x01 0x00  
0xfe 0xff 0x03 0x00  

这对我来说似乎是一个随机的模式。它与波形文件中存储通道的方式有关吗?不应该是这样的:

0x00 0x00 0x00 0x00  
...  ...  ...  ...  

PS:我使用python内置模块'wave'来读取文件。

5 个答案:

答案 0 :(得分:3)

数据不是随机的

看着它我似乎每行看到2个int值,little-endian每个2个字节:

0x00 0x00 0x00 0x00  
0x01 0x00 0xff 0xff  
0x00 0x00 0x00 0x00  
0x00 0x00 0x01 0x00  
0xff 0xff 0x01 0x00  
0xfe 0xff 0x03 0x00  

解码为:

 0  0
 1 -1
 0  0
 0  1
-1  1
-2  3

所以你看到那些非常接近0的数字(接近沉默),看起来像其他人所说的一样抖动。

答案 1 :(得分:1)

从我记得的频道应该是交替的,所以44.1 khz的1秒将是88,200 k样本的流,左右交替或者规范说什么。

Audacity也不应该浮动 - > int转换错误,只有相反的方式。尝试从整数样本开始,而不是flotatng点。或者有一个已知值的通道(即Ox8f8f)和另一个0,这可能更容易理解。

答案 2 :(得分:1)

预期静音的极低电平信号可能是由从32位转换为16位的dither引起的。

答案 3 :(得分:0)

已删除代码和上一篇文章。

沉默:“真正的”沉默必须为零。否则它通常被称为“房间”沉默,如果你不使用噪音门,它会出现非常小的噪音。 (记录) 它只是一个想法:请记住,使用有符号值将导致1位用于有符号/无符号标记。也许(我不知道)这是你在使用audacity将其转换为有符号波形文件后所看到的。对不起,我没有时间来测试这个。

Wave文件: 我不知道你对声音文件有多了解,但是: 如果你只想添加沉默,请尝试这种方式: 每个样本的大小为X位:因此一个样本需要X / 8个字节。 你知道采样率 - 所以你可以将原始的原始字节数组复制成一个大小(silence_length_in_samples bytes_per_frame)+(原始)+(silence_length_in_samples bytes_per_frame),然后使用它将其写回声音文件我希望可以做到的python工具。

2频道: 原始字节组织在: [sample1(channel1_bytes,channel2bytes)] [sample2(channel1_bytes,channel2_bytes).... 我希望我的意思很明确:))

答案 4 :(得分:0)

您可以在此代码中查看这些数字是什么:

import struct
struct.unpack("f", struct.pack("I", 0xfeff0300))
(-1.6948435790786458e+38,)

他们似乎都非常小,可以说是沉默的数字。我生成了静音并将其保存为32位浮点WAV并且没有得到小数字。我的文件包含零,不包括标题。

0.2秒的无声,2通道浮点数据可以这样生成:

import array
silence = array.array("f", [0] * int(44100 * 2 * 0.2))