2016-06-26 68 views
1

我呼籲爲我迄今未能解決的問題尋求幫助... 我使用樹莓派3模型B上我插上了一個Focusrite Scarlett 2i2 USB聲卡,插上一個XLR麥克風。例如,Audacity的整體工作正常。它可以錄製和/或播放聲音。 現在我想用這個設置在Python中記錄一個流,並使用FFT函數對它進行分析,以獲得我正在聽的聲音的音高的實時估計。當我對樹莓運行與Python 2.7的代碼,它的工作原理爲4歐5秒鐘,然後它停止與以下異常:python2.7樹莓派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,異常出現之後發現。

所以我的問題很簡單,有人知道這是從哪裏來的嗎?爲什麼我不能有1024的CHUNK大小,如果我想要或需要?爲什麼它可以在計算機上正確運行,而不是在Pi上運行?有解決方案嗎?

很多感謝, 愛德華

+0

相關:http://stackoverflow.com/questions/10733903/pyaudio-input-overflowed - 檢查輸入格式(速率和格式),如果不是這樣,代碼太慢,無法處理數據。 – Caramiriel

回答

0

不知道你的問題可以明確地回答你措辭的方式。希望我能指出你幾個方向。我一直在用模型3做一些音頻流處理工作,所以我對你的例子非常感興趣。

Pi和電腦最大的區別在於CPU的速度和內存 - 1.2GHz的CPU和1GB的RAM比任何低端電腦都低很多。使用解釋型語言進行流處理可能會增加

看起來您正在對記憶進行所有記錄 - 然後在最後寫出它。我想這就是溢出發生的地方。我認爲塊大小隻是一個紅鯡魚。

如果你要堅持Python處理,我認爲更好的選擇將寫入幀數據,因爲它收到。

在我看來,我認爲更好的選擇是直接使用arecord或ffmpeg/avconv將流直接記錄到文件中。但我絕對有興趣看看你是否可以在Python中做到這一點

你安裝了什麼O/S - Raspbian或Raspbia Lite?

編輯
只爲利益着想 - 你嘗試添加調試打印 每個前追加正好看到幀串的大小崩潰過嗎?