2011-07-08 17 views
5

Hola, estoy enfrentando un problema con PyAudio que no puedo resolver. Cuando lo uso en la red (después de un tiempo) se cuelga. El error que consigo esPyAudio Over collapse de red

 
Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "C:\Python27\lib\threading.py", line 505, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "C:\Users\maboroshi\Desktop\myChat\chat.py", line 71, in server 
    frames_per_buffer = chunk) 
    File "C:\Python27\lib\site-packages\pyaudio.py", line 714, in open 
    stream = Stream(self, *args, **kwargs) 
    File "C:\Python27\lib\site-packages\pyaudio.py", line 396, in __init__ 
    self._stream = pa.open(**arguments) 
IOError: [Errno Device unavailable] -9985 

Mi código está por debajo (así la mayor parte :-P

Esto es para descifrar los datos y la gestión de las conexiones

 
def decrypt_my_message(msg): 
    iv = "1234567812345678" 
    key = your_friends_key 
    if len(key) not in (16, 24, 32): 
     raise ValueError("Key must be 16, 24, or 32 bytes") 
    if (len(msg) % 16) != 0: 
     raise ValueError("Message must be a multiple of 16 bytes") 
    if len(iv) != 16: 
     raise ValueError("IV must be 16 bytes") 
    cipher = AES.new(key, AES.MODE_CBC, iv) 
    plaintext = cipher.decrypt(msg) 
    return plaintext 

### Server function ### 
def server(): 
    HOST = '' 
    PORT = 9001 
    ### Initialize socket 
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    server_socket.bind((HOST, PORT)) 
    server_socket.listen(5) 
    ### Start recieve loop 
    read_list = [server_socket] 
    while True: 
     readable, writable, errored = select.select(read_list, [], []) 
     for s in readable: 
      if s is server_socket: 
       conn, addr = s.accept() 
       read_list.append(conn) 
       print "Connection from ", addr 
      else: 
       msg = conn.recv(2024) 
       if msg:     
        cmd, msg = ord(msg[0]),msg[1:] 
        if cmd == CMD_MSG: 
         listb1.insert(END, decrypt_my_message(msg.strip()) + "\n") 
         listb1.yview(END) 
        elif cmd == CMD_AUDIO: 
         #d = speex.Decoder() 
         #d.initialize(speex.SPEEX_MODEID_WB) 
         p = pyaudio.PyAudio() 
         stream = p.open(format = FORMAT, 
             channels = CHANNELS, 
             rate = RATE, 
             input = True, 
             output = True, 
             frames_per_buffer = chunk) 
         stream.write(decrypt_my_message(msg), chunk) #Write the data back out to the speakers 
       else: 
        s.close() 
        read_list.remove(s) 

Y esto es para conectar y enviar audio codificado

 
def encrypt_my_audio_message(msg): 
    key = your_key 
    iv = '1234567812345678' 
    aes = AES.new(key, AES.MODE_CBC, iv) 
    encoder = PKCS7Encoder() 
    pad_text = encoder.encode(msg) 
    msg = aes.encrypt(pad_text) 
    return msg 

def connectToServer(): 
    CLIENT_PORT = 9001 
    CLIENT_HOST = str(entryhost.get()) 
    global s 
    try: 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.connect((CLIENT_HOST, CLIENT_PORT)) 
     print "Connected\n" 
    except: 
     print "Could not connect" 

### Client Function ###   
def client(cmd, msg): 
    try: 
     s.send(cmd + msg) 
    except: 
     print "You are not connected" 

def sendAudio(): 
    p = pyaudio.PyAudio() 
    stream = p.open(format = FORMAT, 
        channels = CHANNELS, 
        rate = RATE, 
        input = True, 
        output = True, 
        frames_per_buffer = chunk) 
    data = stream.read(chunk) 
    return encrypt_my_audio_message(data) 
## stream.stop_stream() 
## stream.close() 
## p.terminate() 

def keypress(event): 
    if event.keysym == 'Escape': 
     root.destroy() 
    #x = event.char 
    if event.keysym == 'Control_L': 
     #print("Sending Data...") 
     client(chr(CMD_AUDIO), sendAudio()) 
     #print("Data Sent!") 

Cualquier idea por qué sucede esto sería más útil

+0

Esta pregunta podría estar mejor dirigida a los desarrolladores de PyAudio, ya que es probable que se trate de algún tipo de error relacionado con los sockets en PyAudio. – Cerin

+0

Estoy de acuerdo con Cerin. Parece ser algún tipo de error de socket. Tal vez un tiempo fuera? –

Respuesta

0

Lo que me salta a la vista es que estás mezclando un thread that blocks con select, y el loop se ve un poco raro. Hay muchas cosas que suceden en ambas direcciones: trate de concentrarse en hacer que el flujo de paquetes entre y hacia afuera funcione como engranajes que se engranan entre sí, o asegúrese de que no haya manera de que alguien esté vacío o lleno cuando lo hagan ". se espera que sea ninguno de los dos.

Usted puede encontrar algo de inspiración de:

0

Mi conjetura es que se está ejecutando en problemas debido a que está creando múltiples objetos y PyAudio abrir múltiples flujos sin cerrar ninguno de ellos.

Debe crear un objeto PyAudio y una secuencia, y volver a utilizar esos objetos.