2016-06-26 5 views
1

Я обращаюсь за помощью к проблеме, которую я до сих пор не смог решить ... Я использую модель малины Pi 3 B, на которой я 'подключили звуковую карту USB Focusrite Scarlett 2i2, на которой подключен микрофон XLR. Например, все работает отлично на Audacity. Он может записывать и/или воспроизводить звук. Теперь я хотел бы использовать эту настройку для записи потока в Python и анализа его с помощью функции FFT, чтобы получить оценку в реальном времени высоты звука, который я слушаю. Когда я запускаю код с Python 2.7 на малина, она работает в течение 4 Ou 5 секунд, затем он останавливается за исключением следующего:python2.7 on Raspberry Pi 3 - Pyaudio Вход переполнен

IOError: [Errno Input overflowed] -9981 

Затем он выходит из строя консоли питона.

Пожалуйста, обратите внимание, что этот код работает отлично на базовом компьютере, но мне нужно работать на PI3 ...

Интересно, если бы не была нить, вызывающая проблемы с переполнением данных, поэтому я вернулся к очень базовому коду, выпущенному Pyaudio, чтобы «проверить» настройку. Поэтому я запустил код ниже и обнаружил, что сталкиваюсь с той же проблемой, с той же ошибкой.

import pyaudio 
import wave 

CHUNK = 1024 
FORMAT = pyaudio.paInt16 
CHANNELS = 2 
RATE = 44100 
RECORD_SECONDS = 5 
WAVE_OUTPUT_FILENAME = "output.wav" 

p = pyaudio.PyAudio() 

stream = p.open(format=FORMAT, 
     channels=CHANNELS, 
     rate=RATE, 
     input=True, 
     frames_per_buffer=CHUNK) 

print("* recording") 

frames = [] 

for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)): 
    data = stream.read(CHUNK) 
    frames.append(data) 

print("* done recording") 

stream.stop_stream() 
stream.close() 
p.terminate() 

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') 
wf.setnchannels(CHANNELS) 
wf.setsampwidth(p.get_sample_size(FORMAT)) 
wf.setframerate(RATE) 
wf.writeframes(b''.join(frames)) 
wf.close() 

Но у меня была идея, чтобы уменьшить размер порции, и я обнаружил, после нескольких прогонов, что выше 1010, появилось исключение.

Так что мой вопрос очень прост, кто-то знает, откуда это взялось? Почему я не могу иметь размер CHUNK 1024, если я хочу или должен? и почему он работает правильно на компьютере, а не на Pi? Есть ли решение?

Большое спасибо заранее, Edouard

+0

http://stackoverflow.com/questions/10733903/pyaudio-input-overflowed - проверьте формат ввода (скорость и формат), и если это не так, код слишком медленный, чтобы обрабатывать данные. – Caramiriel

ответ

0

Не уверен, что если ваш вопрос может быть явно ответил так, как вы выразился. Надеюсь, я могу указать вам пару направлений. Я работаю над потоком аудио с моей моделью 3, поэтому я очень заинтересован в вашем примере.

Наибольшее различие между Pi и компьютером - это скорость процессора и память - 1,2 ГГц процессор и 1 ГБ RAM намного ниже, чем у любого младшего компьютера. Выполнение обработки потока с использованием интерпретируемого языка, вероятно, добавляет

Похоже, что вы делаете всю запись в память, а затем записываете ее в конце. Я предполагаю, что здесь происходит переполнение. Я думаю, что размер куска - просто красная селедка.

Если вы собираетесь придерживаться обработки Python, я думаю, что лучшим вариантом было бы записать данные фрейма по мере его получения.

На мой взгляд, я считаю, что лучшим вариантом было бы использовать iscord или ffmpeg/avconv непосредственно для записи потока непосредственно в файл. Но мне определенно интересно посмотреть, можете ли вы это сделать в Python.

Что вы использовали для установки/установки - Raspbian или Raspbia Lite?

EDIT
Просто ради интересов - вы пытались добавить отладочную печать перед каждым Append только увидеть размер строки кадра, прежде чем он выходит из строя?