基于imx6ull的网络视频监控

本文详细描述了一种基于IMX6ULL开发板的网络视频监控系统,使用QT5框架,涉及服务端的UDP通信、摄像头捕获、本地显示及广播,以及客户端的UDP通信、视频接收和播放功能。开发环境包括DebianGNU/Linux8和4.9.4交叉编译器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于imx6ull的网络视频监控,使用QT5框架编程,包括服务端和客户端两部分。服务端的功能包括udp文本收发、摄像头捕获、本地显示、udp广播和退出程序;客户端功能包括udp文本收发、udp接收视频图像、视频播放。

f72003819d1e4df2b552147bfbcb8c51.png

1 server服务端

3a94123d10e84c759b102db5e969e331.png

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设备驱动框架对摄像头设备进行操作,流程如下:

b4a6aca30bd84ce98c7cc70f830ed1d9.png

  • 在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

 e900d9cfb716484d94c101ba3de97a29.png

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免驱

57b97f69353a4cb9a52bd3b204157ddc.png

  • 开发板:ALPHA I.MX6ULL开发板

  • qt版本 5.12.9

  • 交叉编译器版本 4.9.4

 最后附上源码地址: 

git __e_e:network_monitoring: 基于imx6ull的网络视频监控,使用QT5框架编程,包括服务端和客户端两部分。服务端的功能包括udp文本收发、摄像头捕获、本地显示、udp广播和退出程序;客户端功能包括udp文本收发、udp接收视频图像、视频播放;

git __h_u_b:

 https://github.com/asXXXXXX/network_monitoring.git

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值