2010-09-03 18 views
10

El siguiente código escribe un seno simple a una frecuencia de 400Hz en un archivo mono WAV. ¿Cómo debe cambiarse este código para producir un archivo WAV estéreo ? El segundo canal debe estar en una frecuencia diferente.Cómo escribir archivos estéreo wav en 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

Conjunto 'nChannels = 2' para empezar;) – ChrisF

Respuesta

9

Build a sine_list_y lista paralela con la otra frecuencia/canal, establece nchannels=2, y en el uso bucle de salida for s, t in zip(sine_list_x, sine_list_y): como la cláusula de cabeza, y un cuerpo con dos writeframes llamadas - uno para s, uno para t . IOW, los marcos correspondientes para los dos canales "alternan" en el archivo.

Véase p. this página para una descripción exhaustiva de todos los posibles formatos de archivo WAV, y cito: muestras de audio digitales

multicanal se almacenan como datos de ondas entrelazados que simplemente significa que el audio muestras de un multicanal (como estéreo y envolvente) archivo de onda son almacenados ciclando a través de las muestras de audio para cada canal antes de avanzando al siguiente tiempo de muestra. Esto se hace para que los archivos de audio puedan reproducirse o transmitirse antes de que se pueda leer el archivo completo . Esto es útil cuando se reproduce un archivo grande desde el disco (que puede no encajar completamente en la memoria ) o la transmisión de un archivo a través del Internet . Los valores en el diagrama a continuación se almacenarán en un archivo Wave en el orden en que aparecen en la columna Valor (de arriba a abajo).

y la siguiente tabla muestra claramente las muestras de los canales van a la izquierda, derecha, izquierda, derecha, ...

+5

yo personalmente ver el ir ↑ ↑ ↓ ↓ ← → ← → B A, pero que puede ser sólo yo. –

3

Por ejemplo la producción de un archivo estéreo .wav, ver el test_wave.py module. La prueba produce un archivo con cero valores. Puede modificar insertando valores de muestra alternativos.

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