使用Python中的24位数据从立体声波文件波中读取单个通道的数据

时间:2016-11-09 12:34:17

标签: python numpy scipy wave

我想阅读左边和右边的频道。

 import wave
 origAudio = wave.open("6980.wav","r")
 frameRate = origAudio.getframerate()
 nChannels = origAudio.getnchannels()
 sampWidth = origAudio.getsampwidth()
 nbframe=origAudio.getnframes()
 da = np.fromstring(origAudio.readframes(48000), dtype=np.int16)
 origAudio.getparams()

参数

  (2, 3, 48000, 2883584, 'NONE', 'not compressed')

现在我想将左右声道与24位数据中的波形文件分开

2 个答案:

答案 0 :(得分:1)

参数告诉您每个样本3个字节,48kHz时有2个数据通道。所以,当你说readframes(48000)时你会得到一秒钟的帧,你应该读到一个稍微不同的数据结构:

da = np.fromstring(origAudio.readframes(48000), dtype=np.uint8)

现在你应该有48000 * 2 * 3个字节,即len(da)。要只使用第一个频道,请执行以下操作:

chan1 = np.zeros(48000, np.uint32)
chan1bytes = chan1.view(np.uint8)
chan1bytes[0::4] = da[0::6]
chan1bytes[1::4] = da[1::6]
chan1bytes[2::4] = da[2::6]

也就是说,你创建一个整数数组,每个样本一个,并从源数据中复制相应的字节(你可以尝试直接从readframes()的结果复制并跳过创建da )。

答案 1 :(得分:1)

您可以使用wavio,我编写的一个小模块,使用numpy数组读取和写入WAV文件。在你的情况下:

import wavio

wav = wavio.read("6980.wav")

# wav.data is the numpy array of samples.
# wav.rate is the sampling rate.
# wav.sampwidth is the sample width, in bytes.  For a 24 bit file,
# wav.sampwdith is 3.

left_channel = wav.data[:, 0]
right_channel = wav.data[:, 1]

wavio is on PyPi,来源位于https://github.com/WarrenWeckesser/wavio的github上。