Python读取声音文件,ogg或wav?

时间:2017-06-04 20:37:59

标签: python-3.x audio ffmpeg wav ogg

我想用Python导入音乐,我正在使用soundfile。我注意到导入ogg或wav文件会产生不同的结果,如下所示(wav文件是使用ffmpeg转换ogg文件)。使用下面的代码,我观察到ogg和wav文件之间的细微差别,这种差异是否正常?

编辑:我使用以下命令转换我的ffmpeg -i filename.mp3 newfilename.wav

X, sample_rate= sf.read(wav_file)
print(wav_file)
print(X[0:20,])

它输出:

test_inputs/Shikantaza.wav
[[  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [ -3.05175781e-05  -3.05175781e-05]
 [ -3.05175781e-05   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]]
test_inputs/Shikantaza.ogg
[[  1.17459308e-06   3.78499834e-07]
 [  5.19584228e-06   2.25495864e-06]
 [  1.13173719e-05   6.28675980e-06]
 [  1.07316619e-05   4.50928837e-06]
 [  2.70867986e-06  -3.40946622e-06]
 [  5.37277947e-06   5.06399772e-07]
 [  3.64179391e-06   6.27796169e-07]
 [ -5.09244865e-06  -6.14764804e-06]
 [ -4.38827237e-06  -3.74127058e-06]
 [ -5.41250847e-06  -3.70974522e-06]
 [ -2.75347884e-06  -7.08531957e-07]
 [ -9.67129495e-07   6.15705801e-07]
 [ -4.91217952e-06  -3.82820826e-06]
 [  4.38740926e-06   6.00675048e-06]
 [ -3.00040119e-06  -4.78463562e-08]
 [ -2.18559871e-05  -1.67418439e-05]
 [ -1.57035538e-05  -8.82137283e-06]
 [ -1.28820702e-05  -5.31934711e-06]
 [ -9.44996100e-06  -8.10974825e-07]
 [ -5.33486082e-06   3.71237797e-06]]

1 个答案:

答案 0 :(得分:2)

对于第一个文件,您要在WAV中解码为16位线性PCM,然后将其转换为浮点数。对于第二个文件,您将直接解码为浮点数。 16位线性PCM的精度低于浮点数,因此会丢失信息,尽管与有损压缩损失相比,损耗通常可以忽略不计,因此可以忽略不计。

尽管WAV最常用于16位线性PCM,但也可以将浮点PCM存储在wav文件中(尽管文件大约是两倍大)。在wav中写浮点数:

ffmpeg -i in.ogg -c:a pcm_f32le out.wav

对于有损格式的解码器也可能存在差异,这会产生稍微不同的结果。此外,如果其中一个解码器不是无间隙的,它可能只产生整个帧,因此可能在开始和/或结束时有一些额外的样本。