0

我使用模块制作了一个录音机,python-sounddevice但记录是 NumPy 数组,所以我将它们转换为列表然后返回,但它不起作用:

import sounddevice as sd, numpy as np, scipy.io.wavfile as wavf
fs = 48000
sd.default.samplerate = fs
sd.default.channels = 2
r = sd.rec(2*fs)
sd.wait()

wavf.write("C:\\...\\r.wav", fs, r) # works
wavf.write("C:\\...\\r2.wav", fs, np.array(r.tolist())) # doesn't work
4

1 回答 1

1

默认情况下numpy.array会创建一个 64 位浮点数 ( numpy.float64) 数组,但是 WAVE 文件格式不是为 32 位浮点数设计的。

你可以使用类似的东西:

np.array(r.tolist(), dtype=np.float32)

最初从多媒体多媒体编程接口和数据规范 1.0 (1991) 开始,WAVE 文件仅支持少数几种数据格式,广泛使用的一种是 Microsoft 脉冲编码调制 (PCM) 16 位定点编码。数据点表示为整数。

1994 年,随着新多媒体数据类型和数据技术的出现,许多新格式被引入,但仍然没有正式注册浮点编解码器。几年后的 1998 年RFC 2361已经列出了 Wave Format 0x0003 (IEEE:float),尽管没有实现细节。

目前大多数音频播放器都支持 32 位浮点采样编码,但支持 64 位浮点采样的却很少。编码器ffmpeg或播放器等MPlayer支持 64 位 PCM 编码,应该能够在r2.wav不进行任何修改的情况下进行转换和播放。

于 2020-12-12T17:00:39.003 回答