PyAudio Over Network дает сбой

Здравствуйте, я столкнулся с проблемой с PyAudio, я не могу решить. Когда я использую его по сети (через некоторое время), он падает. Я получаю ошибку

Исключение в потоке Thread-1:
Traceback (последний вызов был последним):
  Файл "C:\Python27\lib\threading.py", строка 552, в __bootstrap_inner
    self.run()
  Файл "C:\Python27\lib\threading.py", строка 505, запущен
    self.__target(*self.__args, **self.__kwargs)
  Файл "C:\Users\maboroshi\Desktop\myChat\chat.py", строка 71, на сервере
    frames_per_buffer = chunk)
  Файл "C:\Python27\lib\site-packages\pyaudio.py", строка 714, в открытом виде
    stream = Stream(self, *args, **kwargs)
  Файл "C:\Python27\lib\site-packages\pyaudio.py", строка 396, в __init__
    self._stream = pa.open(** аргументы)
IOError: [Errno устройство недоступно] -9985

Мой код ниже (ну большая часть этого:-P

Это для расшифровки данных и управления соединениями

def decrypt_my_message(msg):
    iv = "1234567812345678"
    key = your_friends_key, если len (ключ) отсутствует в (16, 24, 32): повысить ValueError("Ключ должен быть 16, 24 или 32 байта") if (len (msg)) % 16)!= 0: повысить ValueError("Сообщение должно быть кратно 16 байтам"), если len(iv)!= 16: повысить ValueError("IV должно быть 16 байт")
    cipher = AES.new(ключ, AES.MODE_CBC, iv)
    plaintext = cipher.decrypt(msg) возвращать открытый текст ### Серверная функция ###
def server():
    HOST = ''
    PORT = 9001
    ### Инициализировать сокет 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)
    ### Запустить цикл получения read_list = [server_socket], в то время как True: читаемый, доступный для записи, errored = select.select(read_list, [], []) для s в доступном для чтения: если s is server_socket:
                conn, addr = s.accept()
                read_list.append(conn) вывести "Connection from ", addr
            else:
                msg = conn.recv(2024) если 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, каналы = CHANNELS, скорость = RATE, вход = True, выход = True,
                                        frames_per_buffer = chunk)
                        stream.write(decrypt_my_message(msg), chunk)    # Записать данные возвращаются спикерам:
                    s.close()
                    read_list.remove(s) 

И это для подключения и отправки зашифрованного аудио

def encrypt_my_audio_message (msg):
    ключ = ваш_ключ
    iv = '1234567812345678'
    aes = AES.new(ключ, AES.MODE_CBC, iv)
    encoder = PKCS7Encoder()
    pad_text = encoder.encode(msg)
    msg = aes.encrypt(pad_text)
    возврат сообщения

def connectToServer():
    CLIENT_PORT = 9001
    CLIENT_HOST = str(entryhost.get())
    глобальный с
    пытаться:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((CLIENT_HOST, CLIENT_PORT))
        печать "Подключено \ n"
    Кроме:
        печать "Не удалось подключиться"

### Клиентская функция ###        
def client(cmd, msg):
    пытаться:
        отправка (cmd + msg)
    Кроме:
        печать "Вы не связаны"

def sendAudio ():
    p = pyaudio.PyAudio ()
    stream = p.open (format = FORMAT,
                    каналы = КАНАЛЫ,
                    скорость = RATE,
                                        input = True,
                    выход = True,
                    frames_per_buffer = chunk)
    data = stream.read(chunk)
    вернуть encrypt_my_audio_message (данные)
##    stream.stop_stream()
##    stream.close()
##    p.terminate()

определение нажатия клавиши (событие):
    if event.keysym == 'Escape':
        root.destroy()
    #x = event.char
    if event.keysym == 'Control_L':
        #print("Отправка данных...")
        клиент (chr(CMD_AUDIO), sendAudio())
        #print("Данные отправлены!")

Любые идеи, почему это происходит, были бы наиболее полезными

2 ответа

Меня бросает в глаза то, что вы смешиваете поток, который блокируется с помощью select, и цикл выглядит немного странно. У вас много вещей, происходящих в обоих направлениях - попробуйте и сконцентрируйтесь на том, чтобы поток пакетов входил и выходил, как шестеренки, сцепляющиеся воедино, или убедитесь, что никто не будет пустым или заполненным, когда они ' Ожидается, что ни то, ни другое.

Вы можете найти вдохновение от:

Я предполагаю, что вы сталкиваетесь с проблемами, потому что вы создаете несколько объектов PyAudio и открываете несколько потоков, не закрывая ни один из них.

Вы должны создать один объект PyAudio и один поток и повторно использовать эти объекты.

Другие вопросы по тегам