如何在Python中编写立体声wav文件?

问题描述:

以下代码将400Hz频率的简单正弦信号写入单声道WAV文件。如何更改此代码才能生成立体声 WAV文件。第二个频道应该是不同的频率。如何在Python中编写立体声wav文件?

import math 
import wave 
import struct 

freq = 440.0 
data_size = 40000 
fname = "WaveTest.wav" 
frate = 11025.0 # framerate as a float 
amp = 64000.0  # multiplier for amplitude 

sine_list_x = [] 
for x in range(data_size): 
    sine_list_x.append(math.sin(2*math.pi*freq*(x/frate))) 

wav_file = wave.open(fname, "w") 

nchannels = 1 
sampwidth = 2 
framerate = int(frate) 
nframes = data_size 
comptype = "NONE" 
compname = "not compressed" 

wav_file.setparams((nchannels, sampwidth, framerate, nframes, 
    comptype, compname)) 

for s in sine_list_x: 
    # write the audio frames to file 
    wav_file.writeframes(struct.pack('h', int(s*amp/2))) 

wav_file.close() 
+1

设置'nchannels = 2'的一个开始;) – ChrisF 2010-09-03 15:43:26

建立一个平行sine_list_y列表与所述其它频率/信道,设置nchannels=2,并在输出回路使用for s, t in zip(sine_list_x, sine_list_y):作为标题条款,以及具有两个writeframes呼叫的身体 - 一个用于s,一个用于t 。 IOW,两个通道的相应帧在文件中“交替”。

参见例如this页的所有可能的WAV文件格式的详尽描述,我引用:

多通道数字音频采样 存储为隔行波数据 它只是意味着音频多信道的 样品(例如 立体声和环绕声)波形文件 通过循环存储每个通道的音频 样本,然后 前进到下一个采样时间。 这样做是为了在可以读取整个文件之前播放或传输音频文件 。当从磁盘 (可能不完全适合 内存)播放大文件或通过 Internet流式传输文件时,这是方便的 。下面的图 中的值将按照它们在 值列(从上到下)中列出的顺序存储在Wave文件 中。

和下表清楚地表明去左边通道的样品,右,左,右,...

+5

我个人认为他们会↑↑↓↓←→←→B A,但可能是只有我。 – 2013-06-19 13:17:14

为了产生立体声.wav文件的示例,请参见test_wave.py module。 测试产生一个全零文件。 您可以通过插入交替采样值进行修改。

nchannels = 2 
sampwidth = 2 
framerate = 8000 
nframes = 100 

# ... 

    def test_it(self): 
     self.f = wave.open(TESTFN, 'wb') 
     self.f.setnchannels(nchannels) 
     self.f.setsampwidth(sampwidth) 
     self.f.setframerate(framerate) 
     self.f.setnframes(nframes) 
     output = '\0' * nframes * nchannels * sampwidth 
     self.f.writeframes(output) 
     self.f.close()