您好,我遇到了一个无法解决的 PyAudio 问题。当我通过网络使用它时(一段时间后)它崩溃了。我得到的错误是
线程 Thread-1 中的异常:
回溯(最近一次通话最后):
文件“C:\Python27\lib\threading.py”,第 552 行,在 __bootstrap_inner
自我运行()
运行中的文件“C:\Python27\lib\threading.py”,第 505 行
self.__target(*self.__args, **self.__kwargs)
服务器中的文件“C:\Users\maboroshi\Desktop\myChat\chat.py”,第 71 行
frames_per_buffer = 块)
文件“C:\Python27\lib\site-packages\pyaudio.py”,第 714 行,打开
流 = 流(自我,*args,**kwargs)
__init__ 中的文件“C:\Python27\lib\site-packages\pyaudio.py”,第 396 行
self._stream = pa.open(**参数)
IOError: [Errno 设备不可用] -9985
我的代码在下面(大部分:-P
这是用于解密数据和管理连接
def decrypt_my_message(味精):
iv = "1234567812345678"
键 = your_friends_key
如果 len(key) 不在 (16, 24, 32) 中:
raise ValueError("Key 必须是 16、24 或 32 字节")
如果 (len(msg) % 16) != 0:
raise ValueError("消息必须是 16 字节的倍数")
如果 len(iv) != 16:
raise ValueError("IV 必须是 16 字节")
密码 = AES.new(密钥,AES.MODE_CBC,iv)
明文 = cipher.decrypt(msg)
返回明文
### 服务器功能###
定义服务器():
主机 = ''
端口 = 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]
而真:
可读,可写,错误 = select.select(read_list, [], [])
对于 s 可读:
如果 s 是 server_socket:
连接,地址 = s.accept()
read_list.append(conn)
打印“连接自”,地址
别的:
味精 = conn.recv(2024)
如果味精:
命令,味精= ord(味精[0]),味精[1:]
如果 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()
流 = p.open(格式 = 格式,
频道 = 频道,
率 = 率,
输入=真,
输出=真,
frames_per_buffer = 块)
stream.write(decrypt_my_message(msg), chunk) #将数据写回扬声器
别的:
s.close()
read_list.remove(s)
这是用于连接和发送加密音频
def encrypt_my_audio_message(msg):
键 = 你的键
iv = '1234567812345678'
aes = AES.new(key, AES.MODE_CBC, iv)
编码器 = PKCS7Encoder()
pad_text = encoder.encode(msg)
msg = aes.encrypt(pad_text)
返回消息
定义连接服务器():
客户端口 = 9001
CLIENT_HOST = str(entryhost.get())
全球
尝试:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((CLIENT_HOST, CLIENT_PORT))
打印“已连接\n”
除了:
打印“无法连接”
### 客户端功能###
定义客户端(cmd,味精):
尝试:
s.send(cmd + msg)
除了:
打印“您未连接”
默认发送音频():
p = pyaudio.PyAudio()
流 = p.open(格式 = 格式,
频道 = 频道,
率 = 率,
输入=真,
输出=真,
frames_per_buffer = 块)
数据 = 流。读取(块)
返回 encrypt_my_audio_message(数据)
## stream.stop_stream()
## stream.close()
## p.terminate()
def 按键(事件):
如果 event.keysym == 'Escape':
root.destroy()
#x = event.char
如果 event.keysym == 'Control_L':
#print("发送数据...")
客户端(chr(CMD_AUDIO),sendAudio())
#print("数据已发送!")
发生这种情况的任何想法都将是最有帮助的