Как писать стерео WAV-файлы в Python? - PullRequest
11 голосов
/ 03 сентября 2010

Следующий код записывает простой синус с частотой 400 Гц в монофонический WAV-файл.Как следует изменить этот код, чтобы создать стерео WAV-файл.Второй канал должен быть на другой частоте.

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

Ответы [ 2 ]

9 голосов
/ 03 сентября 2010

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

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

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

и в следующей таблице четко показаны сэмплы каналов, идущие влево, вправо, влево, вправо, ...

3 голосов
/ 03 сентября 2010

Пример создания файла стерео .wav приведен в модуле test_wave.py . Тест выдает файл с нулевым значением. Вы можете изменить, вставив чередующиеся значения образца.

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