学生党 Python 软件开发请教

2018-01-04 19:42:41 +08:00
 hchechao2

这是一个课的大作业,我想用 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,而且阿里云带宽很小,我也预料到延迟会比较大,但想先实现整个的工作流程

2410 次点击
所在节点    Python
3 条回复
julyclyde
2018-01-04 20:10:26 +08:00
SIGSEGV 是内存方面的问题啊
你这个 target=play.play 函数是哪儿来的?是不是这个组件有问题?
hchechao2
2018-01-04 21:08:54 +08:00
@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')
julyclyde
2018-01-05 20:43:41 +08:00
不太看得懂你的程序
你的函数里经常饮用一些“不知道从哪儿来的”变量

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/420134

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX