2010-09-03 21 views
10

Poniższy kod zapisuje prosty sinus o częstotliwości 400 Hz do pliku mono WAV. W jaki sposób należy zmienić ten kod, aby wytworzyć plik WAV o formacie stereo. Drugi kanał powinien być na innej częstotliwości.Jak pisać pliki stereo wav w Pythonie?

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' na początek;) – ChrisF

Odpowiedz

9

budowy równoległego sine_list_y lista z drugiej częstotliwości/kanału, ustaw nchannels=2 iw zastosowaniu pętli wyjście for s, t in zip(sine_list_x, sine_list_y): jak klauzula nagłówka i ciała z dwoma writeframes połączeń - po jednym dla s, jeden dla t . IOW, odpowiednie ramki dla dwóch kanałów "naprzemiennie" w pliku.

Zobacz np. this stronę do dokładnego opisu wszystkich możliwych formatach WAV, cytuję:

wielokanałowe cyfrowe próbki dźwiękowe są przechowywane jako przeplotem danych falowych co oznacza po prostu, że dźwięk próbek wielokanałowego (taki jak plik dźwiękowy stereo i dźwięk przestrzenny) to zapisany przez cykliczne odtwarzanie próbek audio przed wysłaniem do następnego czasu próbkowania. Wykonuje się to, aby pliki audio mogły być odtwarzane lub przesyłane strumieniowo, aby można było odczytać cały plik . Jest to przydatne pod warunkiem, że odtwarzany jest duży plik z dysku (który może nie pasować całkowicie do pamięci ) lub przesyłany strumieniowo plik przez Internet w postaci . Wartości na poniższym diagramie zostaną zapisane w pliku Wave w kolejności, w jakiej są wymienione w kolumnie Wartość od góry do dołu.

a Poniższa tabela pokazuje wyraźnie próbki kanałów dzieje w lewo, w prawo, w lewo, w prawo, ...

+5

osobiście zobaczyć je będzie ↑ ↑ ↓ ↓ ← → ← → B A, ale to może być tylko ja. –

3

Na przykład produkujących plik stereo .wav, zobacz test_wave.py module. Test generuje plik zerowy. Można modyfikować, wstawiając zmienne wartości próbek.

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