2010-09-03 13 views
10

Aşağıdaki kod, tek bir WAV dosyasına 400Hz frekansında basit bir sinüs yazar. Bu kod, bir stereo WAV dosyasını üretmek için nasıl değiştirilmelidir. İkinci kanal farklı bir frekansta olmalıdır.Python'da stereo wav dosyaları nasıl yazılır?

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

Set 'nchannels = 2'FC bir başlangıç ​​için;) – ChrisF

cevap

9

Yapı diğer frekans/kanala paralel bir sine_list_y listesi nchannels=2 ayarlanır ve iki writeframes aramalar başlık madde ve bir gövde olarak çevrimin çıkışı kullanım for s, t in zip(sine_list_x, sine_list_y): içinde - s için bir, t için bir . IOW, dosyadaki iki kanal için "alternatif" karşılık gelen kareler.

Bakınız örn

Çok kanallı dijital ses örnekleri basitçe çok kanal ses o örnekleri demektir geçmeli dalga verilerinin olarak saklanır: this tüm olası WAV dosya biçimlerinin ayrıntılı bir açıklama için sayfa, aynen aktarıyorum ( stereo ve surround gibi) dalga dosyası örneklerinden bir sonraki örnekleme zamanına ilerlemeden önce her kanal için no.lu örneklerde dolaşarak saklanır. Bu, ses dosyalarının tüm dosyanın okunabilmesi için oynatılabilmesi veya aktarılabildiği şekilde yapılır. Bu, diskinden büyük bir dosya oynatırken ( belleğe tam olarak sığmayabilir) veya Internet üzerinden bir dosya akışı yaparken kullanışlıdır . Aşağıdaki şemasındaki değerler bir Wave dosyasında Değer sütununda listelendikleri sırayla (yukarıdan aşağıya) saklanacaktır. Stereo .wav dosyası üreten bir örnek için

ve Aşağıdaki tabloda açıkça kanalların örnekleri sağ, sağ, sol, sol gidiyor gösteriyor ...

+5

Ben şahsen onları B A → ↑ ↓ ↓ ← → ← ↑ gidiş bkz, ama bu sadece bana olabilir. –

3

, test_wave.py module bakın. Test, sıfırdan bir dosya üretir. Alternatif örnek değerleri ekleyerek değişiklik yapabilirsiniz.

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