2010-09-03 3 views
10

Следующий код записывает простой синус на частоте 400 Гц в монофонический WAV-файл. Как этот код должен быть изменен для создания файла WAV . Второй канал должен быть разной частоты.Как написать стерео wav-файлы в 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

Набор 'nchannels = 2' для начала;) – ChrisF

ответ

9

Построить параллельный sine_list_y список с другой частоты/канала, установите nchannels=2, и в использовании выходного контура for s, t in zip(sine_list_x, sine_list_y): в качестве пункта заголовка и тела с двумя writeframes вызовов - один для s, один для t , IOW, соответствующие кадры для двух каналов «чередуются» в файле.

См., Например, this страница содержит подробное описание всех возможных форматов WAV файлов, и я цитирую:

Многоканальные цифровые аудио образцы хранятся в виде переплетенных данных волн, которые просто означает, что аудио образцы многоканальном (например, стерео и объемный) волновой файл , сохраненный путем циклического воспроизведения аудиосигналов образцов для каждого канала до , продвигающихся к следующему образцу. Это делается для того, чтобы аудиофайлы могли воспроизводиться или транслироваться до того, как весь файл можно прочитать. Это удобно при воспроизведении большого файла с диска (который может не полностью вписываться в память ) или потокового файла через Интернет . Значения на диаграмме ниже будут храниться в волновом файле в том порядке, в котором они перечислены в столбце Значение (сверху вниз).

и следующая таблица наглядно показывает образцы каналов в списке идущие влево, вправо, влево, вправо, ...

+5

я лично вижу их будет ↑ ↑ ↓ ↓ ← → ← → B A, но это может быть только мне. –

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