2016-11-09 25 views
2

我想读取左边​​和右边的通道。从Python中的24位数据的立体声波文件波中读取单个通道的数据

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() 

的parametre

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

现在我想在24个数据

回答

0

您可以使用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,源在GitHub上的https://github.com/WarrenWeckesser/wavio

+0

感谢它的工作,但它修改波16位有符号24位 –

0

分隔参数与波形文件的左,右声道告诉你,你在3个字节有2个通道的数据每个样品在48kHz。所以,当你说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)。

+0

Thanks @John Zwing我想采取左右声道数据 –

+0

@mouridetouba好吧,然后尝试上述解决方案。如果它适用于左声道,则可以对右声道做基本相同的操作,但使用'da [3 :: 6]','da [4 :: 6]'和'da [5 :: 6]' 。 –

相关问题