基于ARM11+Linux的无线视频监控系统

发布者:Qilin520最新更新时间:2014-03-18 来源: elecfans关键字:ARM11  Linux  无线视频  监控系统 手机看文章 扫描二维码
随时随地手机看文章

  1 引言

  随着无线网络的普及,ARM处理器运算的能力不断地增强以及计算机处理图像的技术不断地提高,基于ARM 的视频监控正越来越广泛的应用于学校,社区,酒店,网吧,医疗等各种各样地领域。传统的视频监控系统布线复杂,设备庞大,智能化低,以及软硬件资源得不到充分的发挥。而ARM 嵌入式系统的小型化、占用空间小、成本低廉、结构紧凑、支持无线网络等特点,使得利用S3C6410 的ARM11+linux系统构成各种各样的无线网络数字监控系统具有广泛的应用价值。

  2 系统整体设计

  2.1 硬件总体设计

  本系统采用韩国三星公司ARM11 内核的S3C6410 作为微处理器,该款处理器体积小,尺寸仅相当于一个48mm*67mm 方块的大小,同时集成了丰富的接口,32 位数据总线和32 位外部地址总线,SROM 控制器、 SRAM 控制器、NAND 闪存控制器、64 个中断源的中断控制器、五个三十二位定时器、四个UART、四个DMA 控制器、STN 与TFT LCD 控制器、看门狗、IIS 音频接口、IIC-Bus 接口、两个USB host口、一个USB device 口、两个串行外围接口电路、三个SD 卡接口、camera_if 接口、TV_out 接口、MFC接口、2 路SPI、Touch Screen 接口,其主频可达800MHz,扩展总线最大频率133MHz.在此基本上,还进行了相关的扩展,引出了一个四线RS-232 串口,该串口用于开发主机与S3C6410 开发平台进行通信;配置了1GB 的NANDflash,用于存放嵌入式linux操作系统,应用程序和数据,128MB 的DDR 内存,用于存放运行程序,摄像头捕获的数据;扩展了一个WIFI 模块,用于开发平台与服务器传输视频数据,通过无线网络实现视频远程监控。

  2.2 软件总体设计

  软件总体结构包括引导加载程序Bootloader、操作系统内核,设备驱动程序和应用层程序,其软件结构如图1 所示。

  图1 软件总体结构框图

  图1 软件总体结构框图

  该系统上电后,先运行引导加载程序Bootloader,该程序的作用是初始化硬件设备、建立内存空间的映射表,引导和加载操作系统内核,然后启动嵌入式操作系统linux,接着加载Nand flash 驱动程序、LCD 驱动程序、WIFI 驱动程序等一些必要的驱动程序。

  3 视频数据采集和编码设计

  3.1 基于V4L2 视频数据采集设计

  在Linux 系统下,对视频设备的各种操作是通过Video4Linux2 实现的,简称V4L2.应用程序通过V4L2 提供的接口函数实现视频设备的操作。整个视频数据采集的过程如图2 所示。

  (1) 打开视频设备, int open( const char *pathname, int flags)。调用该函数,若返回值为-1,表示打开失败,否则,表示所打开设备的文件描述符。

  (2)取得设备信息。通过ioctl(cam_fp, VIDIOC_QUERYCAP, &cap)函数来取得设备文件的属性参数并存储于cap 结构中,其中cam_fp 指的是打开的视频设备的文件描述符。

  (3)选择视频输入方式。通过ioctl(cam_fp,VIDIOC_ S_INPUT, &chan)函数设置视频设备的输入方式,其中chan 的数据结构类型是v4l2_input,用来指定视频的输入方式。

  (4 ) 设置视频帧格式。通过ioctl(cam_fp ,VIDIOC_S _FMT, &fmt)函数设置视频的帧格式,其中fmt 的数据结构类型是v4l2_format,用来指定视频的宽度、高度、像素大小等。

  (5)读取视频数据。通过read(cam_fp, g_yuv,YUV_ SIZE)函数,把摄像头一帧的数据存放到g_yuv中,其中YUV_ SIZE 指的是每帧数据的大小。

  (6)关闭视频设备。通过close(cam_fp)函数来实现视频设备的关闭。

  图2 视频数据采集流程框图。

  图2 视频数据采集流程框图。

  3.2 视频数据的H264编码

  为了提高视频数据编码速度,本系统采用的是H264 硬编码方式,硬编码具有不占用CPU 资源,运算速度快等优点,从而满足视频数据实时性的要求。

  具体编码的过程如图3 所示。

  (1)创建H264 编码结构。调用SsbSipH264EncodeInit (width, height, frame_rate, bitrate, gop_num)函数实现的,其中width 表示图像的宽度,height 表示图像的高度,frame_rate 表示帧频,bitrate 表示比特率或码率,gop_num 表示两个相离关键帧之间最多包含多少个帧(B 或P 帧)。

  (2)初始化H264 编码结构,调用SsbSipH264Encode Exe (handle)函数。

  (3)获取视频输入地址,SsbSipH264EncodeGetInBuf (handle, 0)函数来实现,该函数返回视频输入的首地址,存放在p_inbuf 中。[page]

  (4)输入视频数据,调用memcpy(p_inbuf, yuv_buf, frame_size)函数实现,p_inbuf 存放需要编码的数据,yuv_buf 存放原始视频数据,frame_size 表示数据的大小。

  (5)编码视频数据,对p_inbuf 内容进行H264编码,调用SsbSipH264EncodeExe(handle)函数实现。

  (6)输出已编码的数据,SsbSipH264EncodeGetOutBuf (handle, size),该函数返回已编码图像的首地址,size 表示已编码图像的大小。

  (7)关闭硬编码设备,调用SsbSipH264EncodeDeInit (handle)函数实现的。

  图3 H264 编码流程框图

  图3 H264 编码流程框图。

  4 视频数据的传输和显示

  4.1 视频数据传输模块设计

  现代无线通信网络标准主要有3G(第三代移动通信),WI-FI,Bluetooth,Zigbee(紫蜂)等,具体详见表1.

  表1 常用无线通信网络标准的基本比较

  

  由于WI-FI 具有传输率高,支持的协议多,安装及设置简单,成本低等优点,所以本系统采用的无线网络标准是WI-FI.

  4.1.1 WI-FI 无线网络搭建过程

  (1)加载WI-FI 模块。通过insmod 命令加载,这里需要加载2 个文件helper_sd.bin、sd8686.bin,这2 个文件可以从Marvel 官方网站下载。

  (2)搜索WI-FI 网络。先用ifconfig eth1 up 命令把WI-FI 网络接口卡打开,然后用iwlist eth1 scanning命令搜索WIFI 网络。

  (3)设置eth1 的ip 地址和子网掩码。

  (4)设置ESSID.通过iwconfig eth1 essid 402命令实现的,ESSID 用来区分不同的网络。

  (5)设置密码。通过iwconfig eth1 key s:your_key命令实现的,其中your_key 就是登陆密码。

  4.1.2 基于RTP 协议的视频数据传输

  RTP 是实时传送协议( Real-time TransportProtocol)的缩写,代表一个网络传输的协议,为音频、视频上传中的常用协议[5].RTCP 和RTP 一起提供流量控制和拥塞控制服务,它们能以有效反馈和最小开销使传输效率最佳化,因而特别适合传送实时的数据,所以采用该协议传输视频数据。

  本系统采用开源代码Jrtplib 提供的RTP 协议栈,由于Jrtplib 对RFC3550 的实现进行了封装,使得传输视频数据更加简单。由于本系统的网络最大有效载荷为1500 字节,因此设置RTP 包大小的上限为1400 字节,如果发送的数据大于1400 字节,则采用拆包的方法再发送,具体传输过程如图4 和图5 所示。

  图4 发送端流程框图

  图4 发送端流程框图。

  图5 接收端流程框图

  图5 接收端流程框图。

  发送端主要过程如下:

  (1)创建RTP 会话并设置目标地址。调用Create方法得到RTP 会话实例,然后调用AddDestination 方法设置目标IP 以及目标端口号。[page]

  (2)获得数据,调用Get_Data()函数得到。

  (3)发送数据,通过SendPacket()方法实现。

  接收端主要过程如下:

  (1)创建RTP 会话。调用Create 方法来创建一个会话实例,并且在创建会话的同时设置端口号,要与发送端的端口号保持一致。

  (2)接受RTP 数据。调用RTPSession 类的PollData()方法接收数据。

  (3)保存RTP 数据报。通过创建了一个指针数组,里面存放的是RTP 数据报的指针,只要将刚接收到RTP 数据报的指针赋给这个指针数组即可,这样可以节省数据拷贝的时间。

  (4)判断是否接收完成,如果没有,则跳转到第b 步,否则接收端程序退出。

  4.2 视频数据的解码和显示

  由于接收到的数据是经H264 编码的数据,因此,先要对该数据进行解码,然后才能显示。而在服务器端,对视频数据解码用到FFmpeg.FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件。

  解码时主要涉及FFmpeg 下的libavcodec 库、libswscale库和libavformat 库,其中第一个库是一个包含了所有FFmpeg 音视频编解码器的库,第二个库是格式转化库,因为解码后的数据是YUV420 格式,而要在计算机上显示该数据,则需要的是RGB 格式的,该库功能就是把YUV420 格式转化成RGB 格式,第三个库是一个包含了所有的普通音视格式的解析器和产生器的库。

  4.2.1 初始化解码线程

  (1) 注册全部的文件格式和编解码器,调用av_register_all()函数完成注册。

  (2) 设置AVFormatContext 结构体。该结构体是FFmpeg 格式转换过程中实现输入和输出功能,保存相关数据的主要结构,通过av_open_input_file 函数设置该结构体。

  (3) 检查视频流的信息,通过调用av_find_stream_info(pFormatCtx)函数,pFormatCtx-》streams 就填充了正确的视频流信息,pFormatCtx 类型是AVFormatContext.

  (4) 得到编解码器上下文,pCodecCtx= pFormatCtx -》 streams[videoStream]-》codec,pCodecCtx 指针指向了流中所使用的关于编解码器的所有信息。

  (5) 打开解码器,先通过avcodec_find_decoder 函数找到相应解码器,然后调用avcodec_open 函数打开解码器。

  (6) 申请内存用来存放解码数据, 通过调用avcodec_alloc_frame 函数实现,由于解码的数据是YUV420 格式的,因此还需要将该数据转换成RGB 格式,因此,再次调用avcodec_alloc_frame 申请内存用来存放RGB 格式数据。

  (7) 申请内存用来存放原始数据,因为H264 解码时,对于P 帧需要参考前面一个关键帧或P 帧,而B帧需要参考前后帧,因此需要存放原始数据,首先,用avpicture_get_size 来获得需要的大小,然后调用av_malloc 函数申请内存空间。

  (8) 通过调用avpicture_fill 函数将帧和新申请的内存结合起来。

  (9) 创建格式转换上下文,通过img_convert_ctx=sws _getContext(src_w, src_h,src_pix_fmt, dst_w, dst_h,PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL,NULL)方法实现。其中,src_w 表示源图像的宽度,src_h 表示源图像的高度,src_pix_fmt 表示源图像的格式,dst_w 表示目标图像的宽度,dst_h 表示目标图像的高度,PIX_FMT_RGB24 表示目标图像的格式。

  4.2.2 对数据进行H264 解码

  (1) 获得需要解码的一帧数据,由于前面接收端线程已经把接收到的数据存放在一个指针数组中,因此,解码线程只需要从指针数据中获取数据即可。

  (2) 解码数据。调用解码函数avcodec_ decode_video(pCodecCtx , pFrame , &finished , encodedData,size)来解码视频文件。其中,参数pCodecCtx是前面得到视频流编码上下文的指针;参数pFrame存储解码后的图片的位置,参数finished 用来记录已完成的帧数;参数encodedData 是输入缓冲区指针,指向要解码的原始数据;参数size 是输入缓冲区的大小。

  (3) 将已解码的视频数据YUV420 格式转换成RGB 格式,通过调用sws_scale()函数实现格式转换。

  4.2.3 视频数据的显示

  本系统使用QT 下的QImage 显示视频数据,由于QImage 能够存取单个像素,这样在显示前一帧图像的时候,将该图像保存下来,当显示后一帧图像的时候,如果该像素值与前一帧相同,则不必修改该值,从而节省了大量的时间,即哪里变修改哪里,显示过程的具体步骤如下:

  (1) 取得已解码的视频数据,且该数据是RGB 格式的。

  (2) 循环取得视频数据的R 分量、G 分量、B 分量。

  (3) 判断该点的像素值是否与前一帧对应位置的像素值相同,若相同,跳转到第2 步,否则,保存该像素值。

  (4) 对取得的RGB 各自分量,构造该像素点的颜色值,通过调用qRGB(R,G,B)构造方法实现。

  (5) 设置相应点的像素值,首先生成QImage 类的对象,然后调用该类的setPixel(x,y,rgb)。其中,x 是图像的x 坐标值,y 是图像的y 坐标值,rgb 是该点的颜色值。

  (6) 显示图像,通过调用update()方法,该方法会触发绘画事件,因此,在绘画事件里,写入显示图像代码,即可显示刚生成的QImage 对象,通过调用drawImage()方法绘制图像。

  5 结论

  本系统在视频图像采集时,为了降低数据量,采用YUV420 的采样格式。视频数据编码采用H264 硬编码方式,极大地提高了编码速度。而在无线网络传输时,考虑到丢包问题,将编码数据进行拆包然后发送,降低了丢包率。经测试,本系统采集一幅OV9650摄像头拍摄的且分辨率为320X240 的图像,经H264硬编码,编码后的图像数据大致为5KB 左右,降低了数据传输量,并且硬编码每秒可编码25 帧图像数据,达到实时视频数据编码的要求。对于WI-FI 无线网络的传输率一般在11-54Mbps 左右,因此,该无线网络可以满足实时传输视频的需求。本系统构建了高实时性,低成本,低功耗的数字化无线视频监控平台,在该平台基础上,可以搭建各种各样的应用,比如,路况实时监控,人脸识别,仓库报警等应用,该系统具有一定的实用价值。

关键字:ARM11  Linux  无线视频  监控系统 引用地址:基于ARM11+Linux的无线视频监控系统

上一篇:基于Linux/Qt的智能家居系统设计
下一篇:双端口RAM在ARM与DSP通信系统中的应用

推荐阅读最新更新时间:2024-03-16 13:38

监控系统传输线的选择方案比较
  每个监控工程都有其自身的特点和特殊性,因此在组建监控网络时需要充分考虑这些具体情况,选用最为合适的图象和信号传输方式。鉴于同轴电缆、双绞线和光纤是目前监控系统中使用最广的三种传输介质,我们可以从几个方面对它们作一些分析和比较。    一、特点和传输特性分析   1、同轴电缆   一般在小范围的监控系统中,由于传输距离很近,使用同轴电缆直接传送监控图象对图象质量的损伤不大,能满足实际要求。但是,根据对同轴电缆自身特性的分析,当信号在同轴电缆内传输时其受到的衰减与传输距离和信号本身的频率有关。一般来讲,信号频率越高,衰减越大。所以,同轴电缆只适合于近距离传输图象信号,当传输距离达到200米左右时,图象质量将会明显下降,特别是色彩
[电源管理]
linux 内核定时器 timer_list
linux内核使用timer_list 结构体当作定时器。 #include linux/timer.h #include linux/module.h MODULE_LICENSE( GPL ); //不加这句话,虽然不影响功能,但 有时候 程序执行时会打印错误,类似 Disabling lock debugging //due to kernel taint 之类的话 struct timer_list tm; static int num; static void func() { num++; mod_timer(&tm,jiffies+
[单片机]
《ARM与Linux些许问题》第三章:Linux如何从用户态进入内核态
本文基于mstar801平台Linux2.6.35.11内核。 一、Linux从用户态切换到内核态的方法有哪些? 大体分为两种;主动式和被动式。 1.被动式:就是Linux在用户态(ARM在用户模式)工作,没有主动发起请求、而被动地进入内核态;包括硬件中断和程序异常。 2.主动式:就是Linux在用户态(ARM在用户模式)工作,通过发起用户态程序发起命令请求、ARM响应进入特权模式进而Linux切入内核态;就是系统调用。 二、分析上述两种切换的原理 1.被动式原理:当硬件中断过来时,通过硬件直接给CPSR置位、ARM进入IRQ模式、Linux系统进入内核态;或者用户态代码出现异常、硬件也自动完成上述工作
[单片机]
交叉编译链arm-linux-gcc-3.3.2在ubuntu10.04下的安装
1.解压缩arm-linux-gcc-3.3.2到usr/local/arm/3.3.2就不说了 简单 2. cd ~ 进入当前用户home目录下 ls -la 即可以看到文件夹下有一个.bashrc文件,这个是当前用户的bash资源文件 3) sudo vi .bashrc打开这个.bashrc文件,注意一定要sudo打开,不然等下的更改不能被保存 4) 在该文件最后空白处添加以下export PATH=$PATH:/usr/local/arm/3.3.2/bin 保存退出 5) 关闭当前终端,并且重新打开终端(重新打开时会加载.bashrc,因此刚才添加的一行被执行) 6) arm-linux-gcc -v 如果可以看到版本信
[单片机]
交叉编译链arm-<font color='red'>linux</font>-gcc-3.3.2在ubuntu10.04下的安装
移植嵌入式Linux到ARM处理器S3C2410:应用实例
应用实例的编写实际上已经不属于Linux操作系统移植的范畴,但是为了保证本系列文章的完整性,这里提供一系列针对嵌入式Linux开发应用程序的实例。   编写Linux应用程序要用到如下工具:   (1)编译器:GCC   GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc 。   我们应该使用arm-linux-gcc。   (2)调试器:GDB   gdb是一个用来调试C和C++程序的强力调试器,我们能通过它进行一系列调试工作,包括设置断点、观查变量、单步等。   我们应该使用arm-linux-gdb。   (3)Make   GNU Make的主要工作是读进一个文本文件,称为mak
[单片机]
基于AT91RM9200的USB主机端Linux驱动
通用串行总线(usb)是一种新兴的计算机外围串行通信接口标准,它克服传统计算机串/并口的缺陷,具有热插拔、即插即用、数据传输可靠、扩展方便、低成本等优点,已成为当前计算机必备的接口之一,同时也被广泛地应用与嵌入式系统设计中。本文着重介绍嵌入式linux中的usb主机端驱动。其硬件平台是at91rm9200处理器系统,软件平台是linux-2.6.19.2内核。 1 at91rm9200 usb主机端接口硬件构成 at91rm9200处理器是atmel公司一款比较流行的微型处理器,它具有arm920t内核(带有mmu),主时钟频率可达240 mhz,很适合嵌入式系统应用,它同时具有usb主机端和设备端,其中主机端处理开hci协议(o
[单片机]
基于AT91RM9200的USB主机端<font color='red'>Linux</font>驱动
arm-linux gdb调试工具的安装
开发环境:AT91SAM9X25开发板:安装linux2.6.39; pc的虚拟机:Linux version 2.6.18-194.el5 (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) ,arm-linux-gcc的版本为version 4.4.3 二、安装 (1)解压:tar zxvf gdb-6.8a.tar.gz (2)配置安装gdb: cd gdb-6.8 ./configure --target=arm-linux make make install (3)配置安装gdbserver: cd gdb cd gdbserver ./configure --target
[单片机]
arm-<font color='red'>linux</font> gdb调试工具的安装
基于ARM处理器与GPRS技术的水厂监控系统
目前远程监控主要有以下方式: 短距离长线监控、通过市话网、通过Internet 网络、通过自组网络(CDPD网)及通过数传电台监控。 短距离长线监控和通过自组网络自行建设通信网络, 信号质量得以保证, 但建网初期投资巨大, 运营期间维护耗费较高; 通过市话网和Internet 方式, 通信效果好, 信号量大, 运营费用相对低廉, 但接入网络受到限制, 且网络运行效果取决于网络运营商, 难以达到工业现场覆盖面; 数传电台出现较早、应用广泛, 信号传输实时性好、运行费用低, 但建网初期投资巨大、传输范围有限, 易受空间无线信号干扰。 通用分组无线业务GPRS(General Packet Radio Ser -vice) 是在现有GSM
[单片机]
基于ARM处理器与GPRS技术的水厂<font color='red'>监控系统</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved