2010-09-03 8 views
10

Der folgende Code schreibt einen einfachen Sinus mit einer Frequenz von 400 Hz in eine Mono-WAV-Datei. Wie sollte dieser Code geändert werden, um eine Stereo WAV-Datei zu erzeugen. Der zweite Kanal sollte eine andere Frequenz haben.Wie schreibe ich Stereo-WAV-Dateien in Python?

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' für einen Start;) – ChrisF

Antwort

9

Errichten eine parallel sine_list_y Liste mit dem anderen Frequenz/Kanal, eingestellt nchannels=2, und in der Ausgangsschleife for s, t in zip(sine_list_x, sine_list_y): Verwendung als Kopfsatz und ein Körper mit zwei writeframes calls - einem für s, einen für t . IOW, entsprechende Frames für die beiden Kanäle "alternate" in der Datei.

Siehe z.B. this Seite für eine ausführliche Beschreibung aller möglichen WAV Dateiformate und I zitieren:

Multi-Kanal-Digital-Audio-Samples als interlaced Wellendaten gespeichert was einfach bedeutet, dass die Audio Abtastwerte eines Mehrkanal (wie Stereo und Surround) Wave-Datei sind gespeichert durch Radfahren durch die Audio Proben für jeden Kanal vor zur nächsten Probenahme Zeit. Dies geschieht, damit die Audiodateien abgespielt oder gestreamt werden können, bevor die gesamte Datei gelesen werden kann. Dies ist praktisch beim Abspielen einer großen Datei von der Festplatte (die möglicherweise nicht vollständig in Speicher passen) oder Streaming einer Datei über die Internet. Die Werte im nachstehenden Diagramm würden in einer Wave-Datei in der Reihenfolge gespeichert, in der sie in der Spalte Wert (von oben nach unten) aufgeführt sind.

und die folgende Tabelle zeigt deutlich die Kanäle Proben links gehend, rechts, links, rechts, ...

+5

Ich sehe persönlich werde sie ↑ ↑ ↓ ↓ ← → ← → B A, aber das kann mich nur. –

3

Ein Beispiel eine Stereo-.wav Datei Herstellung finden Sie in die test_wave.py module. Der Test erzeugt eine Null-Datei. Sie können ändern, indem Sie abwechselnde Beispielwerte einfügen.

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