2015-07-15 5 views
1

Это играет моно AIFC файлы, но и для любых стерео файлов я громкий взрыв статики:Как играть в стереофайл aiff с pyaudio?

import pyaudio 
import aifc 

CHUNK = 1024 

wf = aifc.open('C:\\path_to_file.aiff', 'rb') 

p = pyaudio.PyAudio() 

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), 
       channels=wf.getnchannels(), 
       rate=wf.getframerate(), 
       output=True) 

data = wf.readframes(CHUNK) 

while data != '': 
    stream.write(data) 
    data = wf.readframes(CHUNK) 

stream.stop_stream() 
stream.close() 

p.terminate() 

стерео файл я тестирую с: https://archive.org/details/TestAifAiffFile

Я на Windows 7, если это важный.

ответ

0

Подкачка каждого другого образца делает трюк. Загрузите весь файл в data, а затем сделать

a = numpy.fromstring(data, dtype = '<i2') 
temp = a[1::2] 
a[1::2] = a[::2] 
a[::2] = temp 

Тогда играть a, как если бы это была строка аудиосэмплов, а не в Numpy массива. Я тестировал его на двух разных файлах aiff, и в обоих случаях он сохраняет оба канала и воспроизводит правильно.

Это работает, вероятно, потому, что файл имеет противоположный порядок байтов, который ожидает pyaudio.

0

Я пробовал ваш код в Linux, и у меня также есть ужасный шум.

aifc модуль, кажется, правильно прочитать файл, я преобразовал его в массив NumPy и это выглядит отлично:

import numpy as np 

data = wf.readframes(wf.getnframes()) 
sig = np.frombuffer(data, dtype='<i2').reshape(-1, wf.getnchannels()) 

Так что я думаю, что проблема в PyAudio или в использовании его.

Я не знаю ни одного решения, но я могу предложить вам альтернативу: Используйте soundfile и sounddevice.

import soundfile as sf 
import sounddevice as sd 

data, fs = sf.read('02DayIsDone.aif') 
sd.play(data, fs, blocking=True) 
0

Вместо того, чтобы делать сложные вещи с байтовой цепочкой, вы также можете рассмотреть пакет audioread вместо aifc/wave/... Он декодирует ваш аудиофайл, используя любой доступный бэкэнд, независимо от формата файла, он всегда возвращает буферов с 16-разрядными символами с минимальными знаками в конце строки, которые вы можете передать pyaudio.

 Смежные вопросы

  • Нет связанных вопросов^_^