V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hchechao2
V2EX  ›  Python

学生党 Python 软件开发请教

  •  
  •   hchechao2 · 2018-01-04 19:42:41 +08:00 · 2443 次点击
    这是一个创建于 2548 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    3 条回复    2018-01-05 20:43:41 +08:00
    julyclyde
        1
    julyclyde  
       2018-01-04 20:10:26 +08:00
    SIGSEGV 是内存方面的问题啊
    你这个 target=play.play 函数是哪儿来的?是不是这个组件有问题?
    hchechao2
        2
    hchechao2  
    OP
       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
        3
    julyclyde  
       2018-01-05 20:43:41 +08:00
    不太看得懂你的程序
    你的函数里经常饮用一些“不知道从哪儿来的”变量
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5480 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 01:31 · PVG 09:31 · LAX 17:31 · JFK 20:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.