Skip to content

popsummer/PyChat

 
 

Repository files navigation

实时文本与视频通信系统


简介:本项目是使用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地址,点击确定后可以进行通信。

实现原理

  1. 通信

    项目中的通信主要使用的是socket模块实现tcp全双工通信,启动程序的时候分别建立一个socket客户端client和服务端server,client去连接对方的server,而本地server则等待对方的client来连接,用以接收信息。

    传输的信息包括文本信息和视频流,两者采用不同的编码,通过网络传输到目的端之后,再进行解码操作,然后将结果显示出来。

  2. 多线程

    由于程序需要同时进行多个任务:显示界面、监听界面点击事件、监听服务端、监听客户端事件、视频客户端以及服务端等。因此,如果只使用一个线程来运行的话会造成程序的阻塞,从而影响性能。

    为了解决这个问题,将视频和文本的服务端与客户端都采用多线程来写,即继承多线程类Thread,这样,各个任务可以在后台运行而互不干扰。

    class VideoServer(Thread):
        def __init__(self):
            super().__init__()
            ...
  3. 文本

    文本的传输比较简单,可以直接通过PyQt界面的输入框获取用户输入的数据,然后将数据编码之后,通过socket传输到目的端,解码之后显示到界面上。

  4. 视频

    视频方面,需要使用到cv库,原理上也不算复杂,通过启动摄像头,不断获取一帧帧图像,这些获取到的图像数据是二进制的数据,因此,可以直接通过网络发送到目的端,通过不断抓取图像,发送到客户端,就形成了视频聊天。

项目难点

项目的难点主要是多线程之间的嵌套调用,由于使用到了Qt的库,如果在不同的线程中调用窗口的话,会出现错误Can not open child at different parent,最终导致程序崩溃。解决这个问题,将Qt函数和线程进行分离,将函数以参数的形式传入线程,让线程去调用。

About

基于python的视频和文字聊天程序

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%