使用python的流式音频在线程化时会延迟

使用python的流式音频在线程化时会延迟,python,multithreading,audio,Python,Multithreading,Audio,我正在制作一个类似skype的程序。目前,我已经实现了基本的聊天和音频聊天功能。我使用sockets、stκeam和pyaudio来实现这些功能。由于我试图实现组呼叫,因此需要将来自服务器的音频数据流传输到所有连接的客户端(ip/端口)。我使用线程来实现这一点 这是我需要你帮助的时候。基本上,当我使用线程时,无论线程上是否有锁,声音都会滞后。虽然,我认为,当我使用锁时,它不应该延迟,因为音频只传输到一个客户端,而另一个线程等待第一个客户端完成(我知道使用这种技术是没有意义的,只是说)。那么,是什

我正在制作一个类似skype的程序。目前,我已经实现了基本的聊天和音频聊天功能。我使用sockets、stκeam和pyaudio来实现这些功能。由于我试图实现组呼叫,因此需要将来自服务器的音频数据流传输到所有连接的客户端(ip/端口)。我使用线程来实现这一点

这是我需要你帮助的时候。基本上,当我使用线程时,无论线程上是否有锁,声音都会滞后。虽然,我认为,当我使用锁时,它不应该延迟,因为音频只传输到一个客户端,而另一个线程等待第一个客户端完成(我知道使用这种技术是没有意义的,只是说)。那么,是什么导致线程时的延迟呢?如何消除它

而且,播放过程中出现了一些奇怪的现象。在一台机器上,音频从客户机完美播放,而在另一台机器上,它只不过是白噪音,我的某些元素试图在麦克风中尖叫。为什么呢?有什么想法吗

多谢各位。很抱歉,我无法共享该代码,但我将回答有关它的任何问题

(新增)

这是一个非常简化的代码版本,其中只编辑了重要的位

import socket  
import time
import threading
import random
import pyaudio
import wave
from multiprocessing import Process


s = socket.socket()        
host = '192.168.2.21'    
port = 5001                
s.bind((host, port))

(meaningless variable declaration was here)
print ('Server Started.')


def playback_f(pass_record, soc, client, port_a, data, c):

    try:

        pass_record = False

        print ('in else')

        stop_recording = False
        try :
            print ('tried')
            soc.sendto('playback'.encode('utf-8'),(client,port_a))
            print ('sent','playback'.encode('utf-8'))
        except Exception as e:
            print (e)

        while stop_recording == False:

            if data !=  b'stop_rec':

                try:
                    data = c.recv(1024)
                    soc.sendto(data,(client,port_a))

                except Exception as e:
                    print (e)

            else:
                stop_recording = True

        print('ended')


    except Exception as e:
        print(e)

def client_worker(isMessage,c,addr,message,alias,quitting,clients,rooms,room_connections):

    while quitting != True:

        try:

            isMessage = False

            data, addr1 = c.recvfrom(1024)
            data = data.decode('utf-8')
            print(data,addr)
            curAddr = addr[0]

            (bunch of code here that has nothing to do with anything)

                                    try:
                                        #print('trying to send : ' + message, (client,port_a))
                                        soc.sendto(('alias_' + alias).encode('utf-8'), (client,port_a))
                                        soc.sendto(('message_' + message).encode('utf-8'), (client,port_a))
                                    except Exception as e:
                                        print(e)

                                else:

                                    try:
                                        p_r = Process(target = playback_f, args = (pass_record, soc, client, port_a, data, c)).start()

                                    except Exception as e:
                                        print(e)


                            except Exception as e:
                                print (e)
(more code here)

while True: 
    print (clients)
    c, addr1 = s.accept() 
    threading.Thread(target = client_worker,args = (isMessage,c,addr1,message,alias,quitting,clients,rooms,room_connections)).start()
因此,要使其易于阅读,这件事(服务器)所做的是:

它从客户端接收一些数据。如果客户端指示它要流式传输音频,服务器将获取该音频,并将其流式传输到给定房间中的所有客户端(每个客户端都没有创建或进入现有房间以便聊天)

有问题的位是:p_r=threading.Thread(target=playback_f,args=(pass_record,soc,client,port_a,data,c)).start()

这会导致声音滞后。我只是试着去做

p_r=进程(目标=回放,参数=(通过记录,soc,客户端,端口a,数据,c)).start()

相反,它不起作用,并且给了我一系列错误,比如:一次只能存在一个连接,并且指向s.bind((主机,端口))。虽然我从未尝试建立新的连接,但我只会使用“进程”来播放

在这一点上我很困惑


p、 客户端所做的只是向服务器发送一个信号“录制”,然后开始向服务器发送音频数据。它还接收并播放线程。

线程。由于GIL,线程不能并行运行。如果您想要真正的多线程,请使用
多处理
或切换到其他Python实现(CPython除外)。此外,在这里共享一个文件也是很重要的。完成。介意看一下吗?