基于H264的智能家居视频监控系统的设计与实现
扫描二维码
随时随地手机看文章
引 言
随着社会的发展,人们对于家居安全的重视性已经逐渐增强,而普通的家居安防例如安全门、保安等已经达不到人们对安全的要求。得益于物联网技术的发展,智能家居得到了迅速发展。通过嵌入式智能家居控制系统能够将视频的采集、编码、传输集为一体,并有效的将采集到的图像进行传输。使得人们能够实时监控家庭的安全情况以及如果出现安全意外能够将犯罪嫌疑人的面貌拍下来帮助警察破案。而 RTP 协议是基于UDP 应用层的针对多媒体数据流的一种实时传输协议。RTP协议能够得到传输的有效反馈及开销最小化使得传输效率最佳,因此非常适合传输实时数据。
1 系统整体方案设计
智能家居视频监控系统主要分为三个部分 :视频图像的采集、图像的编码、编码图像的传输。图 1 所示是该系统的整体结构设计图。
视频图像采集是将USB摄像头连接到S5PV210开发板, 通过Linux系统的V4L2音视频采集接口采集USB的原始图像数据。由于原始图像数据比较大所以需要进行图像的编码, 而 H264编码格式比其他编码方式有更高的数据压缩比。在同等图像质量条件下比 MPEG-2g高 2~3倍, 比 MPEG-4 高 1.5~2倍。因此经过H264压缩过后的视频数据在网络传输过程中所需要的宽带更少,也很经济。而图像的编码是通过 x264 开源视频编码库对采集到的原始视频图像进行编码,编码为H264 格式的频流。图像传输通过开源 RTP 库的JLIBRTP 来实现图像数据的传输。
2 系统硬件设计
智能家居监控系统的硬件主要包括处理器、内存、闪存、USB 摄像头等。而本文设计的智能家居视频监控系统采用的是三星Contex-A8 S5PV210 处理器,运行速度最高可以达到1GHz,1 G 的DDR2 内存充分保证了系统及程序运行的流畅性。1 G 的SLC Nand Flash 使得系统有更大的存储空间。而且其中的 HDMI 接口、USB 接口、WiFi 接口为开发板功能的扩充提供了强大的保障。USB 摄像头采用的是蓝色妖姬M2200 摄像头,像素值达到 1 200 万像素,完全满足对于智能家居视频监控的要求。由于S5PV210 开发板有外接的USB 接口使得安装变的简单。
3 系统软件设计
3.1 V4L2的图像采集
V4L2(Video for Linux2)一般在Linux下进行图像及音频的采集。V4L2 提供了一套 API 接口用以采集音频和视频数据,其中,具体实现是Linux 系统提供的,而且摄像头对于Linux 系统的支持要求不高,只需要支持UVC 即可通过V4L2 来进行图像采集。
Linux 对于 USB 摄像头驱动的支持及V4L2 的支持需要在内核中进行配置。下载 Linux 源码对配置文件进行配置make menuconfig, 在 Linux 内核配置菜单中选中Video for Linux 和 Video Capture 这两个选项即可配置成功。配置后USB 摄像头连接S5PV 开发板时会打印出摄像头的信息在终端上。图 2 所示为V4L2 的图像采集流程图。
V4L2 的视频采集主要是通过ioctl 函数传递不同的控制命令及结构体来设置采集图像的参数。其中ioctl 函数的原型为 :int ioctl(int fd,int request,void *argp)。第一个参数是打开摄像头设备后返回的设备描述符 ;第二个参数是传入的控制命令 ;第三个参数是传入的控制结构体或者需要返回的参数。具体的采集流程如图 2 所示。首先打开摄像头设备,一般为/dev/video 文件,打开文件后查询摄像头支持的图像格式例如亮度、对比度及图片格式等。查询后再根据摄像头支持的图片格式设置采集的图片格式。设置好支持申请缓冲区来进行图像采集,将采集到的原始图像进行编码及传输。当采集完成后关闭摄像头设备。
3.2 x264 图像编码
采集到的原始数据一帧帧的图像数据量大,不适合网络 实时传输。对原始数据进行编码就显得十分重要,本系统采 用 H264 编码的主要原因是 H264 的优势比较大。H264 编码 具有更高的编码效率,更好的视频质量以及强势的网络适应 能力。能够根据不同的传输环境采用不同的传播和播放速率。 而且 H264 的编码选项少,适合开发者进行编码设置。其错误 恢复功能使图像的传输质量得到了保证。
由于 H264 格式的视频流占用的带宽较小,而 x264 是开 源的,H264 视频编码库是最好的有损视频编码器。x264 是 开源的编码库但是开发板的根文件系统中并不支持,所以需要 对 x264 库进行交叉编译移植。交叉编译后将编译后的动态库 文件及相关的头文件拷贝到 S5PV210 开发板的根文件系统中, 为 x264 图像编码搭建好运行环境。在通过 V4L2 采集到摄像 头的原始数据后需要进行 H264 编码。H264 的编码步骤如下:
(1)通过函数 x264_encoder_open 来设置及初始化 x264 编码参数。
(2)将采集到的原始图像数据的缓冲区指针传入编码函数 x264_encoder_encode 进行编码。如果采集的原始图片格式不 是 YUV420 格式,需要首先将图片格式转化为 YUV420 格式 后再进行编码。
(3)编码完成后关闭编码器句柄。
3.3 RTP 视频传输
RTP 协议是一种为了多媒体数据实时传输的高效及准确而现实的网络传输协议。支持单播、多播和组播。RTP 协议是基于UDP 协议的上层协议。由于RTP 协议不能保证数据准确地传输,所以需要和RTCP 协议一起来控制数据传输,其中RTCP 协议主要是对数据的检测和控制。
在传输数据的框架中, 原始图像经过 x264 编码后为H264 格式数据流,图像编码后的NAL 单元的数据可能会大于MTU 值,所以需要对NAL 单元进行分包处理,接收端再进行组包恢复数据。而 RTP 协议的传输流程比较复杂,所以选择开源的RTP 协议实现源码 JLIBRTP 来实现对数据的发送。由于系统不支持JLIBRTP 库所以需要交叉编译 JLIBRTP 库文件,编译好之后将需要的库文件及头文件拷贝到根文件系统上为数据传输搭建好运行环境。
RTP 传输数据需要先进行初始化配置相应的网络,再获取数据进行传输。当数据传输完成之后关闭相应的套接字。流程如图 3 所示。
4 功能测试
为了测试数据传输是否正确,通过客户端连接到服务器 获取数据并查看画面的完整性。采集的图像如图 4 所示。
5 结 语
本文基于 H264 设计与实现了一种智能家居视频监控系 统方案。主要分析了通过 Linux 的 V4L2 系统来采集摄像头 的原始图像,将原始图像用 x264 开源编码库编码原始图像为 H264 格式的数据流,最终通过 RTP 和 RTCP 网络传输协议 来传输数据。实现了图像的实时采集。