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 и один поток и повторно использовать эти объекты.