我使用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'来读取文件。
答案 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))