一种嵌入式高清视频采集与数据流传输系统的制作方法

文档序号:15595145发布日期:2018-10-02 19:25阅读:326来源:国知局

本发明涉及实时视频监控分析领域,特别涉及一种嵌入式高清视频采集与数据流传输系统。



背景技术:

随着机器视觉在工业领域的广泛应用,开发使用监控系统取代工业现场现有人工观察方式,并进行全天候在线监控成为可能性。一方面,监控系统通过图像采集装置获取区域实时图像,经过一定处理发送到远程终端保存和查看,代替人工值守的监控方式;另一方面,使用图像处理算法和工况识别算法,对工业现场中的指定对象进行图像特征的提取和分别,根据提取结果对工业现场的实际状态做出评判。

现有的监控系统一般采用将采集得到的视频流,经过相应处理后,分别采用不同的传输通道将数据分别发送到指定设备。随着工业现场中监控区域的扩大,监控设备增多,对于远程监控管理终端对现场监控设备的管理显得繁琐,一方面,不同数据使用不同发送通道,对于终端需要指定对应的接收线程进行接收与处理,接收通道的增多对于性能要求增大;另一方面,监控设备有线连接方式,在设备部署与移动上存储诸多物理限制,不利于大范围使用。

综上所述,以分布式监控与数据整合的需求为驱动力,结合现有的嵌入式技术和机器视觉技术,研究和设计一种嵌入式高清视频采集与数据流传输系统,既支持网络分布式监控、分析、指导等功能,也保证在满足系统性能需求的前提下降低开发成本。



技术实现要素:

鉴于上述分布式监控智能化的需求,以现有监控技术为基础,本发明主要目的在于开发设计一种嵌入式高清视频采集与数据流传输系统,实现在硬件复杂度较低的平台上完成高清图像采集、分析、编码、传输的功能。

为了实现上述技术目的,本发明的技术方案是:

一种嵌入式高清视频采集与数据流传输系统,包括部署在现场的现场监控终端与部署在远端的远程管理终端,所述的远程管理终端通过网络通信连接至现场监控终端,所述的现场监控终端包括图像采集模块、图像处理分析模块、图像压缩编码模块和视频流媒体服务器模块,所述的图像压缩编码模块分别通信连接图像采集模块、图像处理分析模块和视频流媒体服务器模块;

所述的图像采集模块包括摄像头集成板卡,用于实现对现场的图像实时采集;图像处理分析模块通过对已获取的图像进行图像特征数据提取以得到图像特征数据;图像压缩编码模块对图像进行压缩编码形成视频流;视频流媒体服务器模块将图像特征数据和已压缩编码的视频流进行分别打包,并建立流媒体服务器将数据发送到网络中;终端管理模块接收图像特征数据和视频流数据包,并对数据包内容进行分离处理,并进行解码和存储,同时向显示装置发送图像以显示;

所述的图像处理分析模块、图像压缩编码模块和视频流媒体服务器模块均集成于同一集成电路板上并形成整体式的嵌入式处理终端。

所述的一种嵌入式浮选高清视频流采集与传输系统,所述的图像采集模块获取高清彩色图像数据,在此基础上完成原始视频数据的构建。

所述的一种嵌入式高清视频流采集与传输系统,所述的图像处理分析模块通过主线程对原始视频数据中的一帧图像进行预处理,并使用多线程技术创建容纳有多个子线程的线程池,然后启动线程池中的子线程以分别执行不同的图像特征提取任务,当任一子线程完成相应的特征参数提取结果后停止该子线程,直至所有子线程完成特征参数提取,主线程对所有子线程的提取结果做汇聚和数据打包,发送至视频流媒体服务器模块,然后继续处理下一帧图像。

所述的一种嵌入式高清视频流采集与传输系统,所述的主线程对原始图像进行预处理包括对原始图像进行灰度化、二值化和分水岭分割处理。

所述的一种嵌入式高清视频流采集与传输系统,所述的图像压缩编码模块对已获取的原始视频流进行裁剪和压缩编码处理,压缩编码后得到h.264视频流,并将其逐帧存放在缓冲区,以供视频流媒体服务器模块备用。

所述的一种嵌入式高清视频流采集与传输系统,所述的视频流媒体服务器模块基于rtp/rtcp协议在现场监控终端上搭建视频流媒体服务器,即按照传输要求预先对已完成压缩编码的视频流和图像特征数据进行打包和封装处理,然后采用rtp/rtcp协议进行加载并完成发送,并接受远程管理终端对网络视频流的控制反馈。

所述的一种嵌入式高清视频流采集与传输系统,所述的对已完成压缩编码的视频流和图像特征数据进行打包和封装处理,是混合视频流和图像特征数据进行打包和封装,并在打包和封装的数据包报文中以rtp协议数据报文的扩展标志位x作为标记区分,两种混合数据包通过已建立的流媒体服务器加载发送,接收端接收到数据包后根据扩展标志位对数据包进行分离、组帧和排序。

所述的一种嵌入式高清视频流采集与传输系统,所述的接收端接收到数据包后根据扩展标志位对数据包进行分离、组帧和排序包括以下步骤:

当接收到的rtp数据包大小为12+3+n个字节时,数据包为图像特征参数数据,读取数据包后n个字节的数据,并将其分别存储在对应的特征参数结构体中;否则,该数据包为视频流数据包并进行组帧处理;

依靠rtp视频流数据包中的时间戳确定图像帧之间的相对顺序,根据序号确定图像分片的排序;

构建三个双缓冲链表用于视频流数据包的存储和排序,并为每个链表设定一个时间戳参数用于表示其组织帧的时间戳,这三个组帧链表分为空闲链表和组帧链表,在组帧链表组完一帧图像后将其送给解码线程对其进行解码后,再将该组帧链表放入空闲链表中,三个链表循环使用;

在组帧过程中,当接收到的rtp数据包中时间戳早于当前帧,作为超时处理丢弃该数据包,并继续接受下一个rtp数据包;当接收到的rtp数据包时间戳属于当前组帧时间戳,使用排序算法将其插入到链表中正确位置;当接收到的rtp数据包时间戳晚于当前组帧时间戳,即下一个帧图像的rtp数据包已经到达,此时调取所有组帧链表中时间戳较早的一个,将其所有元素的帧数据进行拼接后拷贝到解码数据缓冲区,之后将当前接收到的rtp数据包作为首元素保存到该链表中,并删除其余元素,修改组帧链表的时间戳。

所述的一种嵌入式高清视频流采集与传输系统,所述的远程管理终端对网络视频流的控制反馈为控制现场监控终端进行网络视频流的播放操作,包括播放、终止、暂停和调整视频参数。

所述的一种嵌入式高清视频流采集与传输系统,所述的终端管理模块独立运行于远程pc机,用于流媒体数据包的接收、解码、本地存储和界面实时显示,图像特征数据的接收、本地数据库存储和界面图表更新。

本发明的技术效果在于:监控系统所采用的图像采集设备支持图像分辨率可支持高分辨率和高帧率输出图像,所构成的原始图像对后续图像处理提供更多的细节;监控系统选用合适的处理器平台,利用其内部集成硬件编解码器对高清图像进行压缩编码,保证系统性能前提下提供视频流服务效率;监控系统将已编码的视频流通过流媒体服务器发布到网络,在分布式网络中每个监控终端作为独立服务器提供流媒体服务,支持客户端点对点视频流获取和存储,并支持客户端对实时视频流的暂停、播放和录制等控制能够;客户端管理软件支持对工业现场监控终端的管理和数据存储、显示和历史查询功能,实现远程对嵌入式监控平台的反馈控制。

附图说明

图1为本发明的硬件总体设计框架;

图2为本发明的软件总体设计框架;

图3为本发明的嵌入式处理终端图像采集流程图;

图4为本发明的嵌入式处理终端图像压缩硬件编码流程图;

图5为本发明的嵌入式处理终端图像特征参数提取和网络发送流程图;

图6为本发明的嵌入式处理终端视频流媒体服务器搭建流程图;

图7本发明的远程pc客户端视频流接收和解码示意图。

具体实施方式

下面结合附图及具体实施方式对本发明再做进一步详细说明。

本发明的硬件总体设计框架图1所示,本系统从部署位置不同可分为嵌入式处理终端和pc客户端。嵌入式处理终端的高清图像采集装置由ov5640摄像头集成板卡组成。嵌入式处理终端基于samsungs5p6818多核处理器扩展外围电路构成,根据各部分功能不同在硬件上划分为高清图像采集模块、存储器模块和外围接口模块。其中,外围接口模块主要由电源模块、调试接口模块、hdmi显示模块和网络传输模块组成。pc客户端为本系统的附加模块,用于工业现场实时查看监控视频和嵌入式处理终端的远程管理。

嵌入式处理终端的图像采集模块集接口使用dvp接口实现,连接ov5640摄像头集成板卡采集rgb高清图像,使用核心板内部集成的fimc作为摄像头控制器传输ov5640摄像头的rgb图像,iic总线用于传输摄像头控制信号。电源模块由电源管理芯片tw6037实现,用于为嵌入式处理终端各模块提供不同的输出电压。存储器模块包括2gbddr3sdram存储器和16gbemmc存储器。调试接口模块由jtag接口和uart接口组成。网络传输模块由以太网集线器和rj45接口组成。hdmi显示模块由microhdmi型接口组成,用于连接hdmi显示器显示监控视频。

基于上述硬件平台系统,本发明所述功能的软件组成架构如图2所示。完成嵌入式平台基础系统软件搭建和相应外围设备的驱动程序设计,并使用通用架构向应用层提供通用的调用接口。应用层软件主要包括高清图像采集模块、图像特征参数提取和网络发送模块、视频压缩编码模块和视频流媒体服务器搭建等模块组成。其中,高清图像采集主要依靠驱动ov5640高清摄像头采集工业现场图像,获取原始视频数据流。图像特征参数提取模块通过运行特定的图像特征提取算法完成,提取特征参数。完成一帧图像的特征参数提取后将其按照已封装的类进行填充打包。视频压缩编码模块通过调用samsungs5p6618集成的多媒体硬件编解码器mfc,经过图像格式转换和视频编码,将原始颜色视频进行h264压缩,降低视频单位数据量以适用于网络传输。视频流媒体服务器基于开源的实时流媒体传输开源第三方库jrtplib构建,实现轻量级的rtp/rtcp流媒体服务端。视频流媒体获取经过多媒体硬件编解码器编码得到的h264视频流和图像特征数据,通过分包和封装等操作,将数据流发送至目标远程客户端。

远程pc机监控软件主要用于监控和管理使用,主要包括实时数据流接收模块、数据包处理模块和远程管理模块。其中,远程pc监控软件基于跨平台c++图像用户界面qt开发框架进行开发设计。实时数据流处理模块接收嵌入式处理终端上流媒体服务器发送的数据流,对接收到的数据包根据报头信息进行视频流数据包和图像特征数据包分离。通过调用开源音视频解码器库ffmpeg对视频流进行解码,并同步在监控终端软件上实时显示和本地保存。图像特征数据的存储基于mysql数据库构建,实现本地存储和数据图标同步显示的功能。远程管理模块支持历史数据查询和对嵌入式处理终端的远程反馈控制。

本发明所述的嵌入式处理终端的图像采集模块,完成ov5640图像采集板卡的驱动设计,其图像采集工作基于v4l2框架实现,其实现步骤如图3所示,具体步骤如下:

(1)使用open()函数打开ov5640摄像头设备文件/dev/video0;

(2)使用vidioc_querycap命令查询ov5640摄像头支持的驱动、总线等信息,确认ov5640设备相关驱动的正常运行;

(3)使用vidioc_g_fmt命令获取ov5640摄像头支持的视频格式;

(4)使用vidioc_s_fmt命令设置ov5640摄像头的采集分辨率为1920×1080,格式为yuyv格式用于后续的h264编码;

(5)使用vidioc_reqbufs命令申请三个图像帧缓冲区,根据申请得到的帧缓冲区地址及其偏移量,使用mmap()函数将其映射到用户空间,使用户可从用户空间内存中直接读取图像数据;

(6)使用vidioc_qbuf命令将上一部申请得到的帧缓冲区全部放入视频输入缓冲区中,并通过vidioc_streamon命令启动ov5640摄像头的视频采集。同时,将ov5640设备的文件描述符放入监听文件描述符集合;

(7)当图像帧可读时且图像采集程序未停止,使用vidioc_dqbuf命令取出图像帧,并将其拷贝复制到指定缓冲区中,分别用户后续的视频压缩编码和图像特征参数提取。之后使用vidioc_qbuf命令将该帧图像帧缓冲区重新放入输入视频缓冲区中,在图像采集程序未停止之前,循环调用本步骤,源源不断地从ov5640摄像头设备上读取视频流数据。

(8)在图像采集程序结束时,使用vidioc_streamoff命令停止ov5640摄像头的视频流采集,并释放前面所分配的所有内存,避免造成内存泄漏。最后使用close()函数关闭摄像头设备。

本发明所述的嵌入式处理终端的图像压缩编码模块,基于samsungs5p6818核心板内部集成的多媒体硬件编解码器mfc,实现实时视频流的h264硬件编码。该硬件编解码器的调用已集成到v4l2框架中,其具体实现如图4所示,步骤如下:

(1)打开并初始化fimc转换器。使用open()函数打开fimc设备文件,并对fimc的图像数据输入和输出地址映射类型进行设置,输入端设置为io_mmap,输出端设置为io_userptr。最后设置fimc输入端和输出端的图像帧大小。

(2)打开并初始化mfc编码器。与fimc类似的,使用open()函数打开mfc设备文件,并将mfc图像数据输入输出地址映射类型都设置为io_mmap。之后设置mfc输入输出图像帧大小、编码类型和帧率。本文需要的目标视频流格式为h.264,因此将mfc编码器类型设置为v4l2_pix_fmt_h264。通过ioctl接口使用vidioc_subscribe_event命令订阅v4l2_event_eos服务事件。

(3)为各个模块分配缓冲区,包括camera-fimc缓冲区、fimc-mfc缓冲区和mfc输出缓冲区,完成缓冲区分配后将各个缓冲区挂载带指定模块对象上,用于图像格式转换和编码过程的输入输出。

(4)原始图像的h.264编码。通过使用poll()函数对摄像头设备、fimc和mfc设备的文件描述符的状态进行监视,当该设备上有新数据可读时,调用ioctl()接口函数,使用vidioc_dqbuf命令将数据从该设备的输出队列中读取并存放在指定缓冲区中。当查询到下一个处理设备状态为空闲时,使用vidioc_qbuf命令将存放有待处理数据的缓冲区放入下一个设备的输入队列用于下一步的数据处理。若设备为忙碌状态时则等待,若设备为终止状态则结束转换和编码工作。通过该方法,实现了fimc对原始数据的读取、处理和输出,mfc对已完成格式转换图像的读取、编码和输出。在编码线程或处理设备未发出停止信号前,循环本步骤,实现对原始视频流的h.264编码。

(5)当编码线程收到停止信号时,调用close()函数关闭fimc和mfc设备,并释放编码线程所分配的内存资源,避免内存泄漏。

本发明所述的嵌入式处理终端的图像处理分析模块,作为本系统所设计的核心功能之一。本系统采用多线程的设计思路设计图像特征参数的提取过程,其具体实现流程如图5所示。通过按图像参数的不同,将其划分为不同的子任务并发执行。一帧图像经过多个子任务的处理后,将各子任务得到的特征数据合并和打包,交由流媒体服务器处理将其发送到远程客户端。

本发明所述的嵌入式处理终端的流媒体服务器模块,本系统基于第三方库jrtplib进行二次开发,在嵌入式处理终端上实现流媒体服务器的搭建。其实现流程如图6所示,具体步骤如下:

(1)rtp会话的创建和初始化

调用jrtplib库中的rtpsession类实例化一个传输对象用于表示此次rtp会话,并调用实例化对象的成员函数create()函数对其进行初始化,包括指定数据传输的端口号等传输参数及其他会话参数。rtpsession类提供了对rtcp数据包的自动处理,rtpsession实例化对象完成初始化后,占用系统的两个端口号,其中一个用于数据传输的rtp端口号,另一个作为rtcp协议使用。在数据传输过程中,服务器端周期性发送sr分组、接收客户端的rr分组,根据分组信息动态调整传输速率等参数。

(2)设置适当的时间戳

通过调用rtpsession类中的settimestamp()函数设置符合要求的rtp协议时间戳。出于网络传输中mtu的限制,每一帧数据可能会根据其长度进行分包发送。为了使接收端在接受rtp数据包后对每一帧视频图像进行还原,接收端必须根据rtp数据包报头中的时间戳进行数据帧的识别、排序和重组。

(3)添加、删除rtp目标地址

rtpsession类支持对目标地址列表进行管理。根据与远程客户端的连接获取得到其ip和端口号,通过调用会话对象的成员函数adddestination()将远程客户端的ip和端口号将其添加到目标地址列表中,并由类中的相关成员函数对其进行管理。所有目标地址存放于一个名为destination的哈希表中,视频流数据发送时从该哈希表中读取目标地址。

(4)使用sendpacket()函数循环发送数据包

调用会话对象的成员函数sendpacket()向所有目标地址发送rtp数据包。该成员函数首先调用jrtplib库中的另一个类rtppacketbuilder,通过该类的成员函数buildpacket()将待发送的数据封装成一个rtp数据包。之后调用rtptransmitter类的成员函数sendrtpdata()读取目标地址,并调用sendto()函数向网络发送rtp数据包。通过循环调用本该成员函数,完成数据包的实时发送任务。

(5)结束会话并销毁所有资源

当流媒体服务器不再需要使用时,需结束流媒体服务线程,并对该线程所占有资源进行销毁,避免造成内存泄漏。其中,结束rtp会话使用rtpsession类中的成员函数byedestroy()函数。

本发明所述的流媒体服务器发送的数据包包括已压缩编码的视频流和经过图像处理得到的图像特征参数数据。对于视频流数据包在发送过程中,由于一帧经压缩编码后的图像数据量可能较大,其数据包长度可能超过了网络传输中1400字节的mtu限制,需要在rtp数据包封装时对其数据包长度进行控制;对于图像特征参数数据包,其大小远小于mtu的限制,为了接收端从接收到的数据包中识别,需要指定其特定的格式。假设图像特征数据大小固定为n个字节,本发明通过指定分配n+3个字节的发送缓冲区,将该缓冲区的前三个字节设置为0xff,剩余缓冲区用于图像特征数据填充。流媒体服务器发送过程中,通过轮流循环询问该图像特征缓冲区和视频流缓冲区,当被询问的缓冲区不为空,则将其发送后清空。

对于视频流的发送,需要根据其单帧图像的大小进行相应处理,其处理流程如图所示,具体步骤如下:

(1)读取视频流缓冲区中一个nal单元,每个nal单元由起始码0001、nalu单元数据内容组成。计算每个nal单元数据内容的长度,其长度为nal总长度减去其起始码得到的长度。

(2)判断每个nal单元数据内容长度是否大于1388字节,如长度小于1388字节,则按照nalunit方式进行打包处理,即对每个nalu单元去除其起始码,剩下的nalu数据内容(包括naluheader和nalu数据)作为rtp数据包的有效载荷;当长度大于1388字节时,则按fu-a方式打包处理。首先获取nalu数据内容长度,按每个rtp数据包有效载荷为1388字节作为基本单位进行分片,其中最后一个分片不足1388字节的nalu数据内容作为一个rtp数据包的有效载荷。将每个分片按顺序添加rtp数据包报文完成封装。

(3)设置参数m、pt、timestamp。参数m在rtp报头中占一位,对于视频流而言,标记一个视频帧的结束。参数pt用于说明rtp报文中有效载荷的类型,根据标准设置为96。时间戳timestamp用于反映该rtp报文的第一个八位组的采样时刻,接收者根据接收到的时间戳计算延迟和抖动,并进行同步控制。对于nalunit包类型,参数m设置为1,时间戳timestamp在sendpacket()函数中传入的是其增量timestamp_inc;对于fu-a类型,除了该nal单元的最后一个分片设置为1外,其他分片均设置为0。尽管一个nal单元进行了fu-a分片,在接收端接收到数据后重新组装成一个nal单元,因此对于同一个nal单元的所有fu-a分片包,其timestamp值应相同。

(4)将nal单元进行rtp数据包封装后,通过调用指定网络发送函数发送打包后的数据包。

(5)在流媒体服务线程未停止之前,循环重复(2)步骤以下过程,处理缓冲区中的下一帧图像。

至此,完成视频流缓冲区的数据包发送处理。

本发明所述的远程pc客户端,作为本发明的附属管理软件,操作人员在远程终端启动监控软件后,监控软件向工业现场的嵌入式处理终端发送连接请求。与嵌入式处理终端连接成功后,发送视频流媒体接收端端口号。流媒体数据接收模块在接收到数据包后,经过对数据包的分离和视频流的解码,并通过自主设计的播放器对其进行播放、截屏、录制、暂停等播放操作。图像特征参数数据模块经过分离后,在软件界面对应的图表进行实时曲线绘制,并将特征数据存入mysql数据库中。最后,监控软件通过历史数据查询模块,支持通过筛选条件查询历史特征和历史图像调阅功能。

本发明所述的远程pc客户端在流媒体数据包接收模块,通过windows系统上对jrtplib库进行移植,并于嵌入式端类似的调用其库中函数构造会话对象,实现数据包的接收,其接收流程如图7所示,具体步骤如下:

(1)初始化接收端rtp会话实例对象

与嵌入式处理终端上流媒体服务器搭建类似的,通过调用rtpsession类实例化一个接收端传输会话对象,并调用实例化对象中的成员函数对其进行初始化。

(2)设置接收模式和地址列表

jrtplib库定义了三种接收模式,用于规定接收端对来自不同发送者的数据接收选择。程序通过调用会话对象的成员函数setreceivemode()将其接收模式设置为receivemode_acceptsome模式,使客户端仅接收指定嵌入式端的rtp数据包,并调用addtoacceptlist()成员函数添加嵌入式处理终端的ip地址,完成接收模式和地址列表的设置。

(3)rtp数据包的接收

jrtplib库支持同时接收多个数据源的rtp数据包,并将每个数据源的rtp数据包分别存放在独立的接收缓存中。根据步骤(2)接收模式的设置,本文所设计的接收端可接收多个数据源的rtp数据包。程序首先调用会话对象中的成员函数poll()接收rtp数据包或rtcp数据包,之后通过循环调用其成员函数gotofirstsourcewithdata()和gotonextsourcewithdata()遍历所有数据源。获取数据源成功后,调用成员函数begindataaccess()对该数据源进行上锁,调用getnextpacket()成员函数获取当前指定数据源的下一个rtp数据包,完成对rtp数据包的组帧处理后,调用deletepacket()函数对该rtp数据包进行删除并释放其占用的空间资源。最后调用enddataaccess()成员函数实现对数据源的解锁。这样,完成一个完整rtp数据包的接收。

(4)rtp数据包的分离、组帧与排序

每个rtp数据包在网络传输中都是独立路由,到达接收端的顺序并不能保证与其发送顺序保持一致。尤其对于被分包处理发送的nal数据单元,不做处理直接按接受顺序组装还原,无法保证数据的准确性。同时,rtp数据包包含了视频流数据包和图像特征参数数据的数据包,需要根据设定对其进行分离。因此,rtp数据包接收后需对其进行分离、组帧和排序。考虑到实时性的要求,程序设定3帧缓存图像,保证在解码第一帧图像时,第二帧图像接收完毕,第三帧图像正在接收中。

rtp数据包的组帧依据主要是rtp数据包报文中时间戳和序号。其时间戳表示图像帧的采集时间,同一帧图像的所有rtp数据包时间戳相同。序号表示图像分割后,各个分片在完整图像帧中的相对位置。因此,依靠rtp数据包中的时间戳确定图像帧之间的相对顺序,根据序号确定图像分片的排序。

根据上述的分析,本程序利用链表在数据移动方面的灵活性,构建三个双缓冲链表用于数据包的存储和排序,并为每个链表设定一个时间戳参数用于表示其组织帧的时间戳。这三个组帧链表分为空闲链表和组帧链表,程序在组帧链表组完一帧图像后将其送给解码线程对其进行解码后,再将该组帧链表放入空闲链表中,三个链表循环使用。

当接收到的rtp数据包大小为12+3+n个字节时,即该数据包为图像特征参数数据,读取数据包后n个字节的数据,并将其分别存储在对应的特征参数结构体中;否则,该数据包为视频流数据包,对其进行组帧处理。

在组帧过程中,当接收到的rtp数据包中时间戳早于当前帧,作为超时处理丢弃该数据包,并继续接受下一个rtp数据包;当接收到的rtp数据包时间戳属于当前组帧时间戳,使用排序算法将其插入到链表中正确位置;当接收到的rtp数据包时间戳晚于当前组帧时间戳,即下一个帧图像的rtp数据包已经到达。此时调取所有组帧链表中时间戳较早的一个,将其所有元素的帧数据进行拼接后拷贝到解码数据缓冲区。之后将当前接收到的rtp数据包作为首元素保存到该链表中,并删除其余元素,修改组帧链表的时间戳。至此,rtp数据包的组帧过程完成。

(5)rtp会话的结束

当图像接收线程不再接收图像数据,在退出线程前,调用会话对象中的byedestroy()函数结束此次会话,并销毁线程分配的系统资源,避免内存泄漏。

本发明所述的远程pc客户端的图像解码部分,基于开源的音视频解码库ffmpeg对图像帧进行解码和图像缩放。对视频帧的解码具体步骤如下:

(1)注册avcodec_register_all()函数注册编解码器。在对解码器定义和初始化前,必须调用该函数,才能使用ffmpeg解码库中的编解码器、解析器和硬件加速器等。

(2)根据指定的编码器id找到注册过的解码器。程序通过调用avcodec_find_decoder()函数查找h264的编码器,h264在ffmpeg库中的id为av_codec_id_h264。

(3)初始化编码器。定义一个avcodeccontext对象用于描述解码器上下文,该对象包含了解码器所需的重要参数信息,包括媒体流类型和解码后的图像格式,这里将其分别定义为avmedia_type_video和av_pix_fmt_yuv420p。之后调用avcodec_open2()函数对avcodeccontext对象完成构建。

(4)为解码帧和图像转换帧分配内存。通过调用av_frame_alloc()函数对解码帧和图像转换帧分配内存空间,分别用于存放解码和图像缩放后的图像数据。

(5)视频帧的解码和图像缩放。经查找并获得解码器后,程序循环检查缓冲区中是否有新的组帧生成。在缓冲区不为空时,读取一个视频帧,通过调用avcodec_decode_video2()函数对其进行解码和本地保存,解码完成后的图像格式为yuv420p格式。之后调用sws_scale()函数对已解码的图像进行格式转换和图像缩放,获得rgb24格式图像用于界面实现使用。每一个视频帧完成解码和缩放工作后,将该视频帧所占用缓冲区释放,作为下一个视频帧的存放空间。循环此步骤,直到解码线程被终止。

(6)释放解码器和系统资源。程序通过调用avcodec_close()函数对正在使用的解码器进行关闭,并调用ffmpeg解码库中提供的内存释放函数对线程分配的系统资源进行释放,最后结束接收线程。

本发明所述的远程pc客户端的图表显示与数据查询模块,在程序中调用qt提供的qtchart模块库api函数封装成自主设计的图表类chart_builder,将图表创建、销毁、参数设置、数据刷新等功能封装为成员函数。图表显示线程创建完成后,根据需求在主界面放置图表控件,并在线程中创建对应的图表类实例化对象,通过每个实例化对象提供的功能接口完成相关设置,之后图表显示线程等待特征数据接收线程接收特征数据。在得到一次完整的特征数据包后,将数据不同参数赋予不同的图表对象,使用数据刷新接口更新下一个数据,之后刷新ui界面显示。客户端在主界面上对数据查询功能设置了两个筛选条件,分别是按时间筛选和按特征筛选。如下图所示,筛选结果分别以图表方式和曲线趋势图的形式体现,并支持将数据导出excel表格的功能选项,方便后续的统计和本地查看。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1