简介:本项目是使用python3搭建的一个在线局域网实时通信系统,可以使用本系统进行文本通行和视频通信。
# 首先安装必要的python库
sudo pip3 install numpy
sudo pip3 install opencv_python
# 然后安装portaudio
sudo apt-get install portaudio19-dev python-all-dev python3-all-dev
sudo pip3 install pyaudio==0.2.11
在安装完必要的库之后,就可以运行了,主要的运行文件是main.py
python3 main.py
启动之后,可以看到输入框,要求输入你的聊天昵称和对方的ip地址,点击确定后可以进行通信。
-
通信
项目中的通信主要使用的是socket模块实现tcp全双工通信,启动程序的时候分别建立一个socket客户端client和服务端server,client去连接对方的server,而本地server则等待对方的client来连接,用以接收信息。
传输的信息包括文本信息和视频流,两者采用不同的编码,通过网络传输到目的端之后,再进行解码操作,然后将结果显示出来。
-
多线程
由于程序需要同时进行多个任务:显示界面、监听界面点击事件、监听服务端、监听客户端事件、视频客户端以及服务端等。因此,如果只使用一个线程来运行的话会造成程序的阻塞,从而影响性能。
为了解决这个问题,将视频和文本的服务端与客户端都采用多线程来写,即继承多线程类
Thread
,这样,各个任务可以在后台运行而互不干扰。class VideoServer(Thread): def __init__(self): super().__init__() ...
-
文本
文本的传输比较简单,可以直接通过PyQt界面的输入框获取用户输入的数据,然后将数据编码之后,通过socket传输到目的端,解码之后显示到界面上。
-
视频
视频方面,需要使用到cv库,原理上也不算复杂,通过启动摄像头,不断获取一帧帧图像,这些获取到的图像数据是二进制的数据,因此,可以直接通过网络发送到目的端,通过不断抓取图像,发送到客户端,就形成了视频聊天。
项目的难点主要是多线程之间的嵌套调用,由于使用到了Qt的库,如果在不同的线程中调用窗口的话,会出现错误Can not open child at different parent
,最终导致程序崩溃。解决这个问题,将Qt函数和线程进行分离,将函数以参数的形式传入线程,让线程去调用。