基于imx6ull的网络视频监控,使用QT5框架编程,包括服务端和客户端两部分。服务端的功能包括udp文本收发、摄像头捕获、本地显示、udp广播和退出程序;客户端功能包括udp文本收发、udp接收视频图像、视频播放。
1 server服务端
1.1 udp文本收发
-
在widget(窗口)类构造函数中实例化一个udpsocket对象,暂不进行端口绑定;
-
当绑定端口按键被按下时,对刚刚实例化的udpsocket进行bind,绑定为7766;
-
同理当解除绑定按键被按下时,对udpsocket进行close(解除绑定);
-
在widget构造函数、绑定端口按键槽函数、解除绑定按键槽函数中对绑定和解绑按键进行互斥;
-
在widget构造函数中连接udpsocket的readyRead信号和widget的readPendingDatagrams槽函数,然后在readPendingDatagrams槽函数中使用readDatagram函数读取udpsocket接收到的数据报,并将结果在textBrowser中显示;
-
在widget构造函数中连接udpsocket的状态更改信号stateChanged和widget的mStateChaged槽函数,然后在mStateChaged槽函数中将当前socket状态显示在textBrowser中,便于调试。
1.2 摄像头捕获
-
在widget构造函数中实例化一个captureThread对象,在该对象中进行捕获操作;
-
连接开始采集按键的clicked信号和captureThread对象的setThreadStart槽函数,在setThreadStart槽函数中根据按键是否按下决定线程是否运行;
-
连接本地播放复选框的clicked信号和captureThread对象的setLocalDisplay槽函数,在setLocalDisplay槽函数中改变本地播放标志;
-
连接开启广播复选框的clicked信号和captureThread对象的setBroadcast槽函数,在setBroadcast槽函数中改变开启广播标志;
-
连接captureThread的imageReady信号和widget的showImage槽函数,在showImage槽函数中将captureThread准备好的image图像显示到视频播放框中,视频播放框的本质是一个label,使用label下的setPixmap函数;
-
在captureThread线程运行函数中使用v4l2设备驱动框架对摄像头设备进行操作,流程如下:
-
在captureThread线程运行函数中根据startFlag判断是否进入yuyv_to_rgb格式转换、本地播放和开启广播的循环;
-
循环遍历缓冲区
-
取出缓冲区
-
图像处理
-
本地显示(根据是否本地显示决定是否发送imageReady信号)
-
广播图像数据
-
重新排队缓冲区
-
-
图像处理
因为是usb摄像头,不是rgb格式的,还需要一个yuyv_to_rgb的格式转换,根据公式用cpu运算转化。
1.3 本地显示
用转换后的rgb格式图像构造一个QImage对象,将这个对象作为参数传递给widget的showImage槽函数,在showImage槽函数中将其显示到label上。
1.4 开始广播
这部分程序在捕获线程中完成(如果放在主线程中,界面都会卡掉)
-
创建一个新的UDP套接字
-
创建一个字节数组
-
创建一个IO读写缓冲区
-
将image转为byte类型再存入buff
-
转换为base64Byte类型
-
使用UDP广播数据
1.5 退出程序
在开发板上没有x按键来退出程序,只能使用ctrl+c来退出程序,一些资源就得不到释放,添加一个退出按键来释放资源。
-
添加退出按钮槽函数
-
停止捕获线程
-
将线程运行状态设置为停止
-
添加析构函数,在析构函数中将运行状态设置为0,并等待运行结束
-
删除线程并将指针指向nullptr
-
-
-
关闭UDP套接字
-
解绑端口
-
删除udpsocket
-
将指针指向nullptr
-
-
关闭主窗口
-
删除ui界面
-
2 client
2.1 udp文本收发
-
在widget(窗口)类构造函数中实例化一个udpsocket对象,暂不进行端口绑定;
-
当绑定端口按键被按下时,对刚刚实例化的udpsocket进行bind,绑定为7755;
-
同理当解除绑定按键被按下时,对udpsocket进行close(解除绑定);
-
在widget构造函数、绑定端口按键槽函数、解除绑定按键槽函数中对绑定和解绑按键进行互斥;
-
在widget构造函数中连接udpsocket的readyRead信号和widget的readPendingDatagrams槽函数,然后在readPendingDatagrams槽函数中使用readDatagram函数读取udpsocket接收到的数据报,并将结果在textBrowser中显示;
-
在widget构造函数中连接udpsocket的状态更改信号stateChanged和widget的mStateChaged槽函数,然后在mStateChaged槽函数中将当前socket状态显示在textBrowser中,便于调试。
2.2 udp接收视频图像
-
在widget(窗口)类构造函数中实例化一个udpsocket_video对象,同样暂不进行端口绑定;
-
连接开始接收复选框的clicked信号和widget对象的play_video槽函数,在play_video槽函数中进行udpsocket_video的绑定和解绑操作,绑定到7756端口;
2.3 播放接收到的视频
连接udpsocket_video的readyRead信号和widget对象的videoUpdate槽函数,在videoUpdate槽函数中进行视频数据的处理和播放;
-
数据大小重置
-
将数据存放到datagram中
-
将数据从base64格式转化为字节数组格式
-
存储为Qimage格式
-
显示到label中
3 其他软硬件介绍
-
内核 :4.1.15
-
根文件系统: Debian GNU/Linux 8 (jessie)
-
内核打开UVC免驱
-
开发板:ALPHA I.MX6ULL开发板
-
qt版本 5.12.9
-
交叉编译器版本 4.9.4
最后附上源码地址:
git __h_u_b:
https://github.com/asXXXXXX/network_monitoring.git