Linux и python: объединение нескольких волновых файлов в один волновой файл

Я ищу способ объединить несколько волновых файлов в один волновой файл с помощью Python и запустить его в Linux. Я не хочу использовать какие-либо дополнения, кроме командной строки оболочки по умолчанию и модулей Python по умолчанию. Например, если у меня есть файлы a.wav и b.wav. Я хочу создать c.wav, который начинается с содержимого из a.wav, затем b.wav. Я нашел волновой модуль, который могу открыть волновой файл и записать в новый файл. Поскольку я действительно новичок в этом мире аудио. Я до сих пор не могу понять, как это сделать. Ниже мой код

import struct, wave

waveFileA = wave.open('./a.wav', 'r')
waveFileB = wave.open('./b.wav', 'r')
waveFileC = wave.open('./c.wav', 'w')

lengthA = waveFileA.getnframes()
for i in range(0,lengthA):
    waveFileC.writeframes(waveFileA.readframes(1))

lengthB = waveFileB.getnframes()
for i in range(0,lengthB):
    waveFileC.writeframes(waveFileB.readframes(1))

waveFileA.close()
waveFileB.close()
waveFileC.close()

Когда я запустил этот код, я получил эту ошибку:

wave.Error: # channels not specified

Кто-нибудь может мне помочь?


person victorxiv    schedule 29.09.2012    source источник
comment
Выложите пожалуйста полную трассировку с него, на какой строчке он умирает?   -  person Perkins    schedule 29.09.2012


Ответы (3)


Вам нужно установить количество каналов, ширину выборки и частоту кадров:

waveFileC.setnchannels(waveFileA.getnchannels())
waveFileC.setsampwidth(waveFileA.getsampwidth())
waveFileC.setframerate(waveFileA.getframerate())

Если вы хотите обрабатывать a.wav и b.wav с разными настройками, вам нужно использовать что-то вроде pysox, чтобы преобразовать их в те же настройки, или для nchannels и sampwidth вы можете решить это самостоятельно.

person Mu Mind    schedule 29.09.2012
comment
Похоже, у вас есть ключ для этого, спасибо. Однако не могли бы вы рассказать мне немного больше о том, что a.wav и b.wav имеют разные настройки? - person victorxiv; 29.09.2012

Похоже, вам нужно позвонить n=waveFileA.getnchannels(), чтобы узнать, сколько каналов использует первый входной файл, аналогично для waveFileB, тогда вам нужно будет использовать waveFileC.setnchannels(n), чтобы сообщить ему, сколько каналов поместить в исходящий файл. Я не знаю, как он будет обрабатывать входные файлы с разным количеством каналов ...

person Perkins    schedule 29.09.2012

Вот ответ, который я ищу

Как объединить два файла wav с помощью Python? (ищите ветка Тома 10)

Это в другой ветке. кто-то уже решил эту проблему.

person victorxiv    schedule 06.10.2012