基于嵌入式Linux 的视频通信系统设计与实现∗
2019-11-13周锦阳
周锦阳 吴 哲 宋 广
(1.92785部队 葫芦岛 125200)(2.中国电子科技集团公司第三十研究所 成都 610000)
1 引言
随着移动互联网技术的迅猛发展,WIFI 网络覆盖率不断增加,4G网络已遍布全国各地[1]。信息科技的高速发展,在丰富人们生活的同时,带来了前所未有的机遇与挑战。视频通信技术不断走向成熟,随着IP 网络带宽的不断提高,视频通信进入了一个新的发展和应用时期,其在视频会议、远程视频医疗、远程视频教育等方面得到越来越广泛的应用[2~3]。
嵌入式系统作为一种实用、高效的计算机系统,以其低成本、低能耗、高性能及可配置等优点[4],逐渐成为电子产品设计开发的研究发展方向,其广泛应用于信息通信、工业控制、交通管理和智能家居等领域[5~6]。
本文以嵌入式ARM 为载体,利用Linux系统的V4L2内核驱动,设计了一种支持视频图像采集、压缩、传输、显示的移动视频通信系统。通过系统功能测试,验证了系统通信的稳定性和连续性,为进一步探索和研究相关内容提供有益参考。
2 总体框架
视频通信系统组成包括通信节点、视频服务器和有线网络等,总体框架如图1 所示,视频通信节点间可通过无线通信实现节点间点对点的视频通信,也可依托已有无线局域网或电信网络,通过WLAN/4G 基站接入现有有线网络,利用视频服务器的路由、转发功能,实现节点间的视频通信。
图1 频通信系统总体框架
3 系统组成
3.1 硬件组成
系统硬件主要由处理单元、无线通信模块、视频采集模块、LCD和电源模块等组成。系统硬件组成如图2所示,节点实物如图3所示。
图2 节点硬件组成框图
图3 节点硬件实物图
处理单元主要负责视频信息的视频的压缩、处理、传输以及自组织网络的建立和维护,其硬件采用深圳天漠科技有限公司的Devkit8500D嵌入式开发系统,该系统采用采用DM3730 处理器,集成了高达1GHz 的ARM Cortex-A8 内核以及高达800MHz 的具有高级数字信号处理的DSP 内核,支持高清720p 视频编解码,并提供了丰富的外设接口,可以有效满足开发需求。
无线通信单元主要负责实现单跳节点间的无线通信,其硬件采用TOTOLINK-N200UP 大功率无线网卡,该网卡采用MIMO 技术,内置信号增强芯片,外置1根可拆卸智能天线,支持IEEE 802.11b/g/n协议标准,无线传输速率高达150Mbps。
视频采集单元主要负责采集节点周围视频图像信息,进行环境状态感知,其硬件采用英蓓特科技有限公司生产的CAM8100-U 数字摄像头,该摄像头高达130W 像素,可支持多种分辨率,该模块通过高速USB2.0 接口连接到ARM 开发板,可实现图像预览等功能。
3.2 软件组成
视频通信过程中,采集端为视频传输的源节点,实现视频的采集、压缩、传输和显示;接收端为视频传输的目的节点,实现视频的接收和显示。采集端和接收端相互协作实现源节点和目的节点间的视频通信。如图4所示。
图4 采集端和接收端间的视频交互流程
采集端和接收端的相关功能是通过V4L2、libjpeg 和socket 的相关编程接口函数实现的。其中,摄像头对视频图像的采集,是通过V4L2 的相关接口函数实现的;视频图像的压缩和本地显示,是通过jpeg 的相关编程接口实现的;视频的发送和接收,是通过socket的接口函数实现的。
4 功能设计
4.1 视频采集
视频图像采集是通过USB 摄像头完成的[7]。在嵌入式Linux系统中可以通过读写设备文件的方式访问和控制USB 摄像头,同时V4L2 模块为USB摄像头提供编程接口,通过编程接口函数,实现视频图像的采集。基于USB 摄像头的视频图像采集流程如图5所示。
图5 视频采集流程
1)开启USB摄像头
USB 摄像头作为嵌入式Linux 系统的视频外设,会在内核中自动生成设备文件名(/dev/video2),并添加到内核注册表中[8],系统通过函数调用开启USB摄像头。
2)获取摄像头的设备信息
获取摄像头的设备信息主要是获取摄像头的驱动名、设备名、设备在系统中的位置、驱动版本号等信息。在嵌入式Linux系统中,V4L2模块提供结构体“struct v4l2_capability”存放设备信息。内核根据获取的摄像头信息,判断该设备是否是V4L2 的视频采集设备。
3)设置采集图像的参数
视频图像采集之前,需要对视频图像的采集参数进行设置,主要包括图像的大小、格式和来源。在嵌入式Linux 系统中,V4L2 模块提供结构体“struct v4l2_format”存放所设置参数。设置的参数包括视频的来源(V4L2_BUF_TYPE_VIDEO_CAPTURE),视频的高度(480)、宽度(320)以及视频的格式(V4L2_PIX_FMT_YUYV)。
4)内存映射
视频采集后存储在内核空间,然而应用程序不能直接访问内核空间,需要建立内核空间和用户空间的联系,以便应用程序调用内核空间的视频数据。由于内存映射具有速度快、占用内存空间小,操作简单等优点,因此本章所设计的系统采用内存映射的方法,建立内核空间和用户空间的地址对应关系,将图像数据从内核空间映射到用户空间中。
5)视频数据采集
视频采集后是以先进先出(First in first out,FIFO)存储在缓存中的。当应用程序读取缓存中的视频数据时,视频数据按照先进先出的顺序从缓存发出,之后该缓冲区重新获取图像数据。
6)取消内存映射和关闭摄像头
解除内存映射,释放内存,调用函数关闭设备,通知程序停止视频采集。
4.2 视频压缩
对视频图像的压缩,是从时间、空间两方面去除图像的冗余信息的。常用的图像压缩方式有无损压缩和有损压缩两种[9]。无损压缩是指,只去除图像冗余信息的压缩,图像质量在压缩前后基本保持不变,无明显的失真。有损压缩是指去除图像的冗余信息和不相干信息的压缩,压缩前后存在一定差异,但是不影响观看效果[10]。无损压缩的特点是压缩后图像质量髙,然而压缩率很低,不能有效降低图像所占存储空间的大小。有损压缩的特点是压缩率髙,压缩后的图像占用的存储空间较小,会有一定程度的失真但是不影响图像的视觉效果。由于无线信道资源的有限性,为实现视频的有效传输,采用有损压缩的方式对视频图像进行压缩。YUV的jpeg压缩流程如图6所示。
图6 YUV压缩JPEG流程
1)初始化压缩对象,申请存储空间
USB 摄像头采集的视频格式为YUYV,对采集的YUYV 格式的视频进行初始化,并向内存申请一段用于存储jpeg图片的空间。
2)设置压缩参数,开始压缩
视频的有损压缩是依据所设定的参数进行的,将压缩参数设置为80%的压缩率,压缩后的jpeg图片像素为320×480。设置完压缩参数后,开始对YUYV格式的视频图像进行压缩。
3)结束压缩,释放jpeg图片。
4.3 视频传输
视频传输采用基于UDP 的socket 视频通信。socket[11]作为Unix/Linux 系统下实现TCP/IP 通信的接口,是一种用于描述IP 端口和地址的进程通信机制。如图7 所示,服务端初始化socket 创建套接字,调用bind()绑定服务端端口号;客服端初始化socket创建套接字,并调用sendto()发送请求,建立和服务端的连接。
图7 UDP的socket通信流程
1)创建UDP套接字
创建UDP 套接字,建立socket 通信。socket()函数在系统中注册一个未绑定的套接字,通知系统建立一个通信端点。
2)设置IP地址和绑定端口号
设置网络通信协议采用IPV4,绑定服务端和接收端的IP 地址,指定端口号,服务端调用函数bind()绑定端口号。
3)服务端接收客户端的“Hello”数据
服务端调用函数recvfrom(),接受来自客户端的数据请求“Hello”,建立和客户端的连接。
4)向客户端发送图像数据
服务端调用函数sendto(),向客户端发送视频图像,将发送缓存区的视频数据发送到指定客户端的地址空间。
5)关闭套接字,切断服务端和客户端之间的连接
调用函数closesocket()关闭套接字,调用函数close()切断服务端和客户端的连接。
4.4 视频显示
视频显示采用基于FrameBuffer的图象显示[12]。FrameBuffer 是运行在Linux 上的优秀图形接口,为所有的硬件提供编程接口,具有硬件无关性,可直接对显存操作,实现视频的显示。基于FrameBuffer视频显示的流程如图8所示。
图8 视频显示流程
1)初始化framebuffer
打开设备FrameBuffer,在嵌入式Linux 系统中,FrameBuffer 所对应的设备文件为“/dev/fb0”,调用函数开启。
2)获取FrameBuffer的固定信息
获取设备FrameBuffer 的固定信息主要是获取屏幕缓冲区的物理地址和屏幕的宽度等的固定信息。
3)获取FrameBuffer的可变信息
获取设备FrameBuffer 的可变信息主要是获取屏幕的分辨率、颜色深度等可变信息。
4)内存映射
屏幕缓冲区到用户地址空间的映射是通过函数调用实现的。
5)视频显示
视频图像的显示是通过函数“jpeg_read_scanliness()”、“jpeg_to_frambuffer()”和“jpeg_finish_decompress()”实现的。
5 功能测试
本文针对视频通信系统,进行了平台间点对点的无线视频通信测试。两个视频通信节点通过无线网卡实现节点间的互联互通,视频采集端将数字摄像头采集的视频数据无线传输给视频接收端,实现视频信息的异地实时、动态显示。视频采集端视频采集如图9(a)所示,视频接收端视频显示如图9(b)所示。
图9 视频通信测试图
6 结语
本文采用嵌入式ARM 系统,结合WIFI 无线通信和数字摄像头视频感知,设计并实现了一种支持视频图像采集、传输、显示的移动视频通信系统。测试结果表明,移动自组织通信系统功能实用可靠、性能良好。随着嵌入式技术的发展和视频通信的广泛应用,未来还需要对嵌入式Linux 系统的工程应用进一步研究,使之更广泛应用于人们的生活和工作。