基于虚拟仪器的网络视频传输系统设计
2023-05-29吴丹阳魏元焜
吴丹阳,魏元焜
(辽宁机电职业技术学院,辽宁丹东,118009)
0 引言
网络视频系统通常指的是安全监视和远程监控领域内用于特定应用的IP 监视系统[1],该系统使用户能够通过IP 网络实现视频监控及视频图像的录像,以及相关的报警管理[2]。与模拟视频系统不同的是,网络视频系统采用网络,而不是点对点的模拟视频电缆,来传输视频及其他与监控相关的各类信息[3]。网络视频系统在安防、医疗等多个领域具有广泛的应用。随着技术的发展,实现网络视频系统的技术手段也在不断革新,一些新的实现方法也在不断涌现,这些方法在各自的应用场景下也有优势[4~7]。利用新技术不断提升网络视频系统性能的研究是开放性的。
虚拟仪器是基于计算机的仪器,计算机和仪器的密切结合是目前仪器发展的一个重要方向[8]。它尽可能采用了通用的硬件,各种仪器的差异主要是软件。因而可充分发挥计算机的能力,有强大的数据处理功能,可以创造出功能更强的仪器。用户可以根据自己的需要定义和制造各种仪器[9]。
因此,本文提出了一种新的、基于虚拟仪器的网络视频系统设计思路,给出了具体的设计方法和关键步骤,并通过实验验证了系统功能。
1 系统整体设计
如图1 所示,系统分为视频采集端和视频播放端,两个模块之间通过WLAN 以rtsp 协议传输视频数据,因此两个模块分别作为rtsp 的服务器和客户端存在[10]。视频采集端负责视频的实时采集,底层硬件为视频采集板卡,搭载海思的专业型智能网络摄像机SoC——Hi3516DV300,对摄像头采集到的视频进行编码和传输。为实现编码和传输功能,板卡运行嵌入式Linux 操作系统,支持多任务处理。以海思媒体处理软件平台(Media Process Platform,简称MPP)实现视频资源的编解码等底层处理,由应用程序启动rtsp 服务,通过网络对外传输视频信号。网络传输可采用有线和无线方式,将视频信号传输给视频显示端。
图1 系统框图
显示端硬件为运行Windows 操作系统的PC。以LabVIEW 虚拟仪器开发平台实现rtsp 的客户端,并实现GUI。基于虚拟仪器的设计思路,视频采集端可作为仪器设备,以LabVIEW 设计仪器面板和仪器的核心逻辑。根据设计需要,可方便地更改仪器面板、增加和删减功能,提高设备的灵活性。
2 开发环境搭建
为在图1 所示系统上实现产品开发,首先要构建开发环境。由于本文给出的方案以嵌入式Linux 为软件基础,因此需要先构建通用的嵌入式Linux 开发环境,然后再利用海思提供的软件开发工具包构建专用开发环境。
2.1 嵌入式Linux 开发环境组成
完整的嵌入式Linux 开发系统同时需要硬件和软件的支持。硬件部分分为目标机、宿主机和控制平台三个部分,三者目前较为广泛采用的连接方式为局域网连接。目标机即网络摄像机本身,由于自身资源有限,只能支持功能实现,无法满足开发要求,因此目标机中的软件开发工作需要依赖于宿主机。宿主机本质上是一个运行Linux 的服务器PC,可以是一个实际的PC,也可以是一个虚拟机。其作用是为编写、编译目标机上的程序并最终生成镜像文件。因此,宿主机和目标机之间主要进行的是文件传输。目标机本身不支持图形界面,Linux 服务器也不便于日常工作,因此常见的做法是引入一个基于Windows 的控制平台,用于登录和管理目标机和宿主机之间的文件传输。而宿主机也可以是控制平台中运行的虚拟机[12]。
目标机是一个完整的嵌入式Linux 操作系统,在软件角度看,需要具有完整的硬件初始化、系统引导、操作系统、文件系统等部件,因此主要有:Bootloader、Linux内核、设备驱动、文件系统,以及应用程序构成。其中Bootloader负责底层硬件的初始化和引导操作系统的载入,Linux 内核从Bootloader 接管控制权后,会进一步完成系统初始化、启动各类进程、加载设备驱动等操作,最终实现任务调度、内存管理等核心控制功能。文件系统中包含系统运行所必需的文件、应用程序等。Bootloader、Linux 内核、设备驱动和文件系统,都需要根据具体的设备来进行移植,应用程序需要基于软件开发平台设计。这些工作均可利用海思提供的软件开发工具包完成[13]。
2.2 编译和使用海思软件开发工具包(SDK)
对于本文选用的Hi3516DV500 型号芯片,应选用海思的arm-himix200-linux 交叉编译工具。
交叉编译工具是指在宿主机上编译目标机可执行文件或镜像文件的工具,海思提供了对应的交叉编译工具。
在root 或sudu 权限下,以tar –xzf arm-himix200-linux.tgz 命令解压安装包,以chmod +x arm-himix200-linux.install 赋予安装脚本可执行权限,然后执行./armhimix200-linux.install 即可执行安装。完成安装后,通过执行source /etc/profile 命令即可生效环境变量。
完成上述工作后,即可进行SDK 的编译。海思的SDK包含了设备驱动、文件系统制作工具、ISP、MPP 等组件,可支持海思芯片的全开发流程。可支持整个工具包和不同级别下的自动化编译。
其主要目录介绍如下:
drv/extdrv/:板级外围驱动源代码
drv/interdrv:mipi,cipher 等驱动源码
osal/:操作系统适配层代码
osdrv/:操作系统及相关驱动
osdrv/opensource:存放Linux 内核源码、u-boot源码、busybox 源码
为减小SDK 包大小,部分工具需要自行下载到SDK 的指定目录,如:
下载4.9.37 版本的Linux 内核源码包,linux-4.9.37.tar.gz 存放到osdrv/opensource/kernel 目录中。
下载yaffs2utils-0.2.9.tar.gz 存放到osdrv/tools/pc/mkyaffs2image/目录中。
下载gdb-7.9.1.tar.gz 存放到 osdrv/tools/board/gdb/目录中。
下载ncurses-6.0.tar.gz 存放到osdrv/tools/board/gdb/目录中。
下载util-linux-2.31.tar.gz 存放到osdrv/tools/pc/cramfs_tool/目录中。
此外,本文使用Ubuntu16.04 作为宿主机的操作系统,需要安装部分依赖。在sudo 环境下,直接接用aptget install 来安装即可:zlib1g-dev、liblzo2-dev、uuiddev、pkg-config、libuuid1、bison、mtd-utils、u-boottools、libncurses5-dev、libcrypto++-dev、binutils、uuid、uuid-dev、gperf、make、gcc、g++。
完成上述工作后,即可在osdrv 目录下执行./make BOOT_MEDIA=emmc all,对SDK 进行指定启动媒介的整体编译。由于本文采用的目标机启动媒介是emmc 存储设备,因此在make all 时添加了BOOT_MEDIA=emmc 配置项。
在osdrv/pub/bin 下,会编译出目标机和宿主机上的工具,包括镜像制作工具、GDB 调试工具等,在hi3516dv300_emmc_image_glibc 下,是编译出的uboot、uImage 和rootfs 的镜像包.osdrv/pub/下的rootfs_glibc.tar 是我们编译出rootfs 镜像的模板。
在osdrv/pub/bin/board_glibc 下是编译出的板端使用的工具。
在smp/a7_linux/mpp 下,是编译出的ko 配置驱动,sample 测试固件程序。
在osdrv/opensource/busybox/busybox-1.26.2/_install 下,是bin sbin usr 文件。
osdrv/tools/pc/jffs2_tool/tmp/sbin 下,配置工具里面所有命令都是指向busybox 的连接。
3 视频采集端设计
本系统以视频采集板卡+OV5647 摄像头构建视频采集端。板卡以海思智能网络摄像机专用SoC(hi3516dv300)为控制核心,对外提供以太网、MIPI、HDMI 等多种接口方便数据的本地和远程传输。
海思官方为SoC 提供了便捷的SDK,用户通过对裁剪好的嵌入式Linux 操作系统和文件系统进行适当配置,即可编译生成系统镜像和文件系统镜像,快速搭建嵌入式软件系统。在Linux 系统基础上,音视频处理功能通过海思提供的MPP 软件平台实现。该软件平台为应用软件屏蔽了芯片相关的复杂底层操作,并直接提供MPI(MPP Program Interface)接口完成相应功能,可支持应用软件快速开发,集成了输入视频捕获、H.265/H.264/JPEG 编码、H.265/264/JPEG 解码、视频输出显示、视频图像前处理(包括去噪增强锐化)示、视频图像前处理(包括去噪增强锐化)图像拼接、图像几何矫正、智能音频等功能。
视频采集端系统层次如图2 所示。硬件层包括视频采集板卡和OV5647摄像头,在板卡上运行的是嵌入式Linux 操作系统,以满足多任务处理的要求。操作系统适配层用于屏蔽不同操作系统(如Linux 和鸿蒙等)的差异,为MPP层提供统一的接口。以MPP 为基础,应用层可以实现直接面向用户的功能。
图2 视频采集端系统层次
3.1 利用MPP 建立视频数据流
图3 给出了MPP 建立视频流的过程,涉及MPP 中的几个关键模块:视频输入(Video Input,VI)、视频解码(Video Decode,VDEC)、视频处理子系统(Video Process Sub System,VPSS)、视频编码(Video Encode,VENC)以及视频输出(Video Output,VO)。可通过绑定在相关模块间建立数据传输通道。
图3 MPP 视频数据流
VI 模块接收摄像头经MIPI 接口传输来的视频数据,将其存入指定的内存区域,这一过程中,VI 模块可对接收到的原始视频图像数据进行处理。VDEC 模块从存储卡中读取保存好的视频图像数据,对其进行解码,存入计算机。VI 或VDEC 处理后的原始视频图像数据向后继续传输,在VPSS 中,控制帧率、对图像进行缩放、旋转、锐化、去噪、遮盖、添加马赛克等操作。VO 模块主动从内存相应位置读取视频和图形数据,并通过相应的显示设备输出视频和图形。VENC 模块对处理后的图像进行编码操作,可产生多种不同的码流,且VENC 支持多路实时编码,且每路编码相互独立。
3.2 实现rtsp 传输
建立rtsp 服务的操作对应视频采集端系统层次中的应用层。它从MPP 平台读到视频码流,将其以rtsp 协议传输,具体流程如图4 所示。
图4 rtsp 传输流程
首先启动rtsp 服务,然后对MPP 平台的各个相关模块进行初始化、启动和绑定操作,以建立数据流通路,最后以异步线程的形式开始获取视频码流。在码流获取线程中,不断等待VENC 空闲,通过调用MPP 接口HI_MPI_VENC_GetStream 将获取到的视频码流进行数据解析,保存到开辟的内存空间中,进而以rtsp 协议发送,最终释放内存,完成一帧数据的接收和发送,循环往复。
4 视频显示端设计
本文以LabVIEW 平台实现视频现时段的界面和控制逻辑设计。控制逻辑主要用于接收用户指令、启动rtsp 客户端服务,读取服务器端发送来的视频数据并予以实时显示。rtsp 视频流通过VLC 媒体播放器的ActiveX 播放,通过调用VLC 的动态链接库实现。为实现多路视频流的动态加载、删除和切换等功能,还需配合LabVIEW 的消息队列处理器框架(即软件设计模式)。
4.1 ActiveX 调用VLC 媒体播放库
首先要保证安装有VLC 播放器,然后进行VLC ActiveX 的安装注册。将VLC 播放器安装目录下的npvlc.dll、libvlccore.dll、libvlc.dll、axvlc.dll、plugins 和lua文件夹复制到 C:WINDOWSsystem32 目录下。运行regsvr32 axvlc.dll 指令,若提 示axvlc.dll 中DLLRegisterServer 成功,则表明ActiveX 控件注册成功。
在程序的实现上,需要使用两个关键类:IVLCControl2 和IVLCPlaylist。前 者作为参数传输给后者,以便视频流在指定控件上的显示。IVLCPlaylist 是控制播放列表动作的类,在程序中,通过调用关键方法,如add(添加到列表)、next(下一个条目)、play(播放)、pause(暂停)、stop(停止),即可控制视频流的播放,并可控制在来自多个采集终端的视频流的切换。图5 给出了利用这两个类实现简单rtsp 流播放的程序示例。建立与视频采集端的连接后,视频播放结果如图6 所示。
图6 LabVIEW 播放rtsp 视频流效果
4.2 消息队列处理器框架
消息队列处理器框架是编写大型LabVIEW 虚拟仪器的典型方法[11]。这一设计模式将每一个相对独立功能的代码片段模块化,把每一个模块视为仪器运行的一个状态。每一个状态由之前的状态指定,状态自身也可以指定下一个(或连续的多个)状态。由于多个状态需要以队列的数据结构通过消息存储和分发,因此称为消息队列处理器。这一设计方法可以将复杂的LabVIEW 程序框图标签化,既控制了LabVIEW 程序框图的规模,又便于程序后期的维护。本文3.1 节中给出的功能相对简单,图5 给出的程序框图仅仅是一个实现功能的示例,这种最基本的事件结构设计框架难以支撑复杂功能的实现。而利用本节所述的消息队列处理器设计框架,可以实现更复杂的功能,如多通道rtsp 视频流的控制操作。
图7 给出了以消息队列处理器设计多通道rtsp 视频流控制的状态迁移图,在消息队列处理器框架下可以用极小的代码修改实现状态添加、删除或修改状态迁移关系。这一设计方法也表明,利用虚拟仪器的软硬分离特性,本系统可根据用户的需求,在产品使用期间,及时进行产品升级,而不影响硬件设备本身。
图7 实现扩展功能的状态迁移图
5 结束语
网络视频传输系统广泛用于安防、医疗、教学等领域,实现方案众多。本文给出的方案简单易行,硬件核心采用国产高性能芯片,避免了国外的技术垄断,尽量采用开源解决方案完成系统设计,最大程度保证系统的安全性。通过融合虚拟仪器技术,极大提高了系统的灵活性,方便系统的升级扩展。