2010-09-03 212 views
10

以下代碼將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

回答

9

建立一個平行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

3

爲了產生立體聲.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() 
相關問題