基于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 软件总体结构框图
该系统上电后,先运行引导加载程序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 视频数据采集流程框图。
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 中。
(4)输入视频数据,调用memcpy(p_inbuf, yuv_buf, frame_size)函数实现,p_inbuf 存放需要编码的数据,yuv_buf 存放原始视频数据,frame_size 表示数据的大小。
(5)编码视频数据,对p_inbuf 内容进行H264编码,调用SsbSipH264EncodeExe(handle)函数实现。
(6)输出已编码的数据,Ss
- 在Linux下使用ADSL(01-26)
- 使用 ADSL 动态 IP 建置虚拟主机(01-26)
- 做个ADSL+LINUX软路由器(01-26)
- 在嵌入式Linux实现802.11b无线网关(03-02)
- 如何保证Linux操作系统下的密码安全 (04-28)
- 在Linux系统下优化Oracle具体步骤(05-01)