2015-03-24 2 views
2

J'essaie pyaudio sur carte Intel Edison, mais il échoue avec les tests intégrés. L'enregistrement et la lecture seuls fonctionnent bien avec mon réglage, mais si j'essaie de câbler l'entrée à la sortie, cela donne une erreur.Pyaudio: Erreur lors du câblage d'entrée à la sortie

File "wire_full.py", line 33, in data = stream.read(CHUNK) File "/usr/lib/python2.7/site-packages/pyaudio.py", line 605, in read return pa.read_stream(self._stream, num_frames) IOError: [Errno Input overflowed] -9981

Est-ce que quelqu'un comprend quel est le problème?

Ci-dessous le code exemple pour le câblage entrée à la sortie en pyaudio:

""" 
PyAudio Example: Make a wire between input and output (i.e., record a 
few samples and play them back immediately). 


This is the full duplex version. 
""" 


import pyaudio 
import sys 


CHUNK = 1024 
WIDTH = 2 
CHANNELS = 2 
RATE = 44100 
RECORD_SECONDS = 5 


if sys.platform == 'darwin': 
    CHANNELS = 1 


p = pyaudio.PyAudio() 


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


print("* recording") 


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


print("* done") 


stream.stop_stream() 
stream.close() 

p.terminate() 

Répondre

1

Je l'ai résolu en changeant la taille de CHUNK à 512. ayant toujours la même erreur de temps en temps, mais au moins il fonctionne la plupart du temps.

S'il y a une idée pourquoi cela fonctionne, ou comment je peux supprimer l'erreur totalement?

Mise à jour

OK, donc je le code entouré de lecture/écriture avec essayer .. sauf, ce qui réduit également la taille de CHUNK à 512, maintenant il fonctionne sans erreur. Si j'utilise 1024 comme taille CHUNK, beaucoup d'images seront perdues et la qualité du son est terrible.

for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)): 
    try: 
     data = stream.read(CHUNK) 
     stream.write(data, CHUNK) 
    except: 
     pass 

Merci @Meta pour l'indice! :)

+1

Voir ma réponse à http://stackoverflow.com/questions/10733903/pyaudio-input-overflowed/28574532#28574532. En bref, le message de dépassement d'entrée signifie que vous ne lisez pas le flux assez rapidement, c'est-à-dire que le tampon qui contient les données audio est envahi par les nouvelles données entrantes avant que vous n'ayez le temps de le lire. Je ne pense pas que pyaudio devrait lancer une exception dans ce cas, car cela peut être acceptable. En outre, car il génère une erreur, vous perdez toutes les données pour cet appel. Voir le patch dans le lien ci-dessus pour un moyen ad-hod pour changer son comportement. – Meta

0

Ce code enregistre le son et joue en arrière immédiatement:

import pyaudio 
import time 
import pickle 

WIDTH = 2 
CHANNELS = 2 
RATE = 44100 

p = pyaudio.PyAudio() 

def callback(in_data, frame_count, time_info, status): 
    return (in_data, pyaudio.paContinue) 

stream = p.open(format=p.get_format_from_width(WIDTH), 
       channels=CHANNELS, 
       rate=RATE, 
       input=True, 
       output=True, 
       stream_callback=callback) 

stream.start_stream() 

while stream.is_active():  
    time.sleep(0.1) 

stream.stop_stream() 
stream.close() 

p.terminate()