您好,我在通过网络发送音频时遇到问题。在我没有距离的本地系统上没有问题但是每当我在远程系统上测试时都有音频但它不是语音输入我想要它的断断续续/滞后等。我相信它是如何处理音频的发送但是我已经尝试了 4 天,但找不到解决方案。
我会发布所有相关代码并尽我所能解释
这些是常量/全局值
#initilaize Speex speex_enc = speex.Encoder() speex_enc.initialize(speex.SPEEX_MODEID_WB) speex_dec = speex.Decoder() speex_dec.initialize(speex.SPEEX_MODEID_WB) #some constant values chunk = 320 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 44100
我发现调整采样率值会产生更多噪音
下面是用于初始化音频设备的 pyAudio 代码,这也是全局的
#initalize PyAudio p = pyaudio.PyAudio() stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, output = True, frames_per_buffer = chunk)
下一个函数是按键函数,它从麦克风写入数据并使用客户端函数发送数据这就是我认为我遇到问题的地方。
我相信我如何处理这个问题,因为如果我按住以获取音频,它会循环并在每次迭代时发送。我不确定在这里做什么。 (想法!!!)
def keypress(event): #chunklist = [] #RECORD_SECONDS = 5 if event.keysym == 'Escape': root.destroy() #x = event.char if event.keysym == 'Control_L': #for i in range(0, 44100 / chunk * RECORD_SECONDS): try: #get data from mic data = stream.read(chunk) except IOError as ex: if ex[1] != pyaudio.paInputOverflowed: raise data = '\x00' * chunk encdata = speex_enc.encode(data) #Encode the data. #chunklist.append(encdata) #send audio client(chr(CMD_AUDIO), encrypt_my_audio_message(encdata))
处理音频的服务器代码
### Server function ### def server(): 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((socket.gethostbyname(socket.gethostname()), PORT)) # socket.gethostbyname(socket.gethostname()) server_socket.listen(5) read_list = [server_socket] ### Start receive loop 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(2048) if msg: cmd, msg = ord(msg[0]),msg[1:] ## get a text message from GUI if cmd == CMD_MSG: listb1.insert(END, decrypt_my_message(msg).strip() + "\n") listb1.yview(END) ## get an audio message elif cmd == CMD_AUDIO: # make sure length is 16 --- HACK --- if len(msg) % 16 != 0: msg += '\x00' * (16 - len(msg) % 16) #decrypt audio data = decrypt_my_message(msg) decdata = speex_dec.decode(data) #Write the data back out to the speaker stream.write(decdata, chunk) else: s.close() read_list.remove(s)
并在 Tkinter 中完成键盘的绑定(bind)
root.bind_all('', keypress)
非常感谢任何想法如何使按键方法根据需要工作或提出更好的方法,或者我可能做错了什么
*干杯
请注意,我已经在没有加密方法的情况下进行了测试,同样的事情:-)
最佳答案
您是否运行了 ping 或 ttcp 来测试两台主机之间的网络性能?
如果您遇到延迟峰值或某些数据包被丢弃,您发送语音流的方法将受到严重影响。 TCP会等待丢包、报丢、等待重传等。
您应该在有损链接和音频压缩上使用 UDP 来优雅地处理丢失的数据包。同样在这种情况下,您必须为传出数据包加上时间戳。
关于Python 音频网络问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7720932/