这是一个课的大作业,我想用 Python 写一个实现语音通话功能的软件,基本原理就是每个客户端录音(可能会加些处理)然后传到阿里云服务器再转发给其他用户播放。现在在最后阶段遇到了一些问题,来向 V2 大佬们请教。
下面是服务器端的部分代码
def trans1(client):#接受音频文件
return recv.recv(client)
def trans2(k,client,t):#转发音频文件
for j in t:
if j.get_result()==0:#如果没接收到文件,程序退出
global closesignal
closesignal = 1
sys.exit(-1)
if j!=t[k]:
while 1:
if not j.isAlive():#接受进程结束后转发
break
recv.send(client,j.get_result())
def trans3():
t1=[]#对每个客户端接受的线程列表
t2=[]#对每个客户端发送的线程列表
while 1:#返回检测符合条件的客户端 list
total=check()
print(total)
if len(total):
break
# for i in total:
i=total[0]#测试第一组
amount=len(i[0])#组内客户端数量
print(amount)
clients=recv.server_connect(amount)#建立 socket
while 1:
for j in range(amount):#接受客户端 j 的文件
if closesignal==1:
sys.exit(-1)
th=MyThread(func=trans1,args=[clients[j][0]])#创建接受子线程
if len(t1)<j+1:#如果是第一次转发
t1.append(th)
else:#如果不是第一次转发
t1[j]=th
t1[j].start()
for k in range(amount):#将客户端 k 的文件转发给其他客户端
if closesignal == 1:
sys.exit(-1)
th2=threading.Thread(target=trans2,args=(k,clients[k][0],t1))#创建转发子线程
if len(t2)<k+1:#同上
t2.append(th2)
else:
t2[k]=th2
t2[k].start()
t2[k].join()
客户端主要代码
def flow(self,s):
while 1:
record.record(self.username)
send.send(s, self.username)
for i in self.userlist:
if self.username != i:
send.recv(s)#这行能跑完,跑完就 crash
t = threading.Thread(target=play.play,args=[i])#播放文件,问题应该出在这一行,跑不到这一行
t.start()
if self.closesignal==1:
s.close()
break
我只成功过一次,这个循环跑不起来,只能传第一次的文件,就会报 Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
ps:非 CS 专业工科学生,代码不规范,各位多包涵
pps:用的是 socket 的 TCP 传的,速度不如 UDP,而且阿里云带宽很小,我也预料到延迟会比较大,但想先实现整个的工作流程
1
julyclyde 2018-01-04 20:10:26 +08:00
SIGSEGV 是内存方面的问题啊
你这个 target=play.play 函数是哪儿来的?是不是这个组件有问题? |
2
hchechao2 OP @julyclyde 那个是播放文件的函数,用的 pyaudio
def play(username): CHUNK = 1024 if os.path.isfile(username+'.wav'): wf = wave.open(username+'.wav', 'rb') p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) data = wf.readframes(CHUNK) while data != b'': stream.write(data) data = wf.readframes(CHUNK) stream.stop_stream() stream.close() p.terminate() else: print('no file to play') |
3
julyclyde 2018-01-05 20:43:41 +08:00
不太看得懂你的程序
你的函数里经常饮用一些“不知道从哪儿来的”变量 |