2011-07-08 19 views
5

您好,我正面臨PyAudio無法解決的問題。當我通過網絡使用它時(過了一段時間)它崩潰了。我得到的錯誤是PyAudio Over Network崩潰

 
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 

我的代碼如下(以及大部分:-P

這是解密數據和管理連接

 
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) 

這是用於連接和發送加密音頻

 
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!") 

任何想法爲什麼發生這種情況將是最有幫助的

+0

這個問題可能會更好地指向PyAudio的開發人員,因爲它可能是某些與PyAudio中的套接字有關的錯誤。 – Cerin

+0

我與Cerin達成一致。它看起來是某種套接字錯誤。也許是暫停? –

回答

0

跳到我身上的事情是,你正在混合thread that blocks與選擇,並且循環看起來有點奇怪。你有很多東西在兩個方向上發生 - 試着把注意力集中在讓數據包流入和流出像齒輪齧合在一起,或者確保沒有辦法讓某人在空閒或充滿時,預計不會。

你可能會找到一些靈感:

0

我的猜測是,你遇到了問題,因爲你是創建多個PyAudio對象和打開多個流而不關閉它們中的任何一個。

您應該創建一個PyAudio對象和一個流,並重新使用這些對象。