已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2012届毕业设计说明书 基于Mjpg-streamer的远程视频监控系统 学 院: 电气与信息工程学院学生姓名: 陈金辉指导教师: 职称 讲师专 业: 自动化班 级: 0801班完成时间: 2012年5月48 / 53摘 要作为安防系统的重要组成部分,视频监控系统随着嵌入式技术、多媒体技术、计算机网络技术的快速发展也在不断地更新与发展。目前新兴的基于嵌入式技术的网络视频监控系统与传统的视频监控系统相比具有体积小、成本低、稳定性高、实时性好等优点,具有广阔的发展前景。本文设计并成功实现了一个基于嵌入式处理器ARM9,Linux操作系统的网络视频监控系统。首先通过两种构架方案的对比,确定了本系统采用浏览器服务器的构架方案。并在此方案下给出了详细的系统拓扑结构图和总体程序流程图。详述了Linux内核的移植和根文件系统制作等平台搭建工作。重点讨论了在嵌入式Linux操作系统下利用linux提供的V4L2 API实现对USB视频设备的视频数据采集;介绍了YUYV与RGB视频格式,MJPEG与JPEG文件格式,使用Libjpeg进行JPEG压缩;在Linux下基于TCPIP协议的Socket编程,实现了视频数据的网络发送。最后着重论述了嵌入式WEB服务器的设计,HTTP的请求响应分析。并对本系统进行了测试。本系统采用模块化设计方法,使得设计更加简洁、高效,具有良好的扩展性和易用性,有利于系统升级。关键词: ARM9;Linux;视频监控ABSTRACTAs an important part of security and defense systems, video surveillance system is developing and updating continuously with the technological innovation of embedded system,multimedia and computer network. The current embeddedsystem based network video surveillance system has a great prospect due to its better portability, lower cost,higher stability and better real-time feature,compared to the traditional video surveillance systemThis paper successfully designed an embedded network video surveillance system based on embedded processor ARM9 and Linux operating systemsFirst of all, Through comparison of the two framework scheme, browser / server architecture scheme is the eventual choice scheme. Under this scheme , the system topology map and overall software flow chart were given in detail. Then, the built work of the development platform such as the Linux kernel transplantation and root file system production are also described in detail . Focused on the use of the V4L2 API of linux in an embedded Linux operating system to capture the video data outputed by USB video devices; The YUYV RGB video format, MJPEG and JPEG file formats, and JPEG compression with Libjpeg; the Linux Socket Programming based on TCP / IP protocol, the video data sent over the network. Finally focuses on the design of the embedded Web server, the HTTP request and response analysis. And the test result of the system.The modular design approach is used in the system which makes the design more compactable,efficient,and ease to upgradeKey words ARM9;Linux; Video surveillance目 录1 绪论11.1 视频监控发展现状和趋势11.2 课题研究的意义22 方案选择与设计32.1 C/S方案32.2 B/S 方案32.3 系统总体方案43 嵌入式Linux开发平台的搭建63.1 FL2440开发板平台介绍6 3.1.1 S3C2440简介6 3.1.2 板载资源介绍63.2 嵌入式系统的构建6 3.2.1 交叉编译工具链、NFS环境的搭建6 3.2.2 linux内核的移植7 3.2.3 根文件系统94 视频采集134.1 V4L2简介134.2 视频采集的实现13 4.2.1 视频采集流程13 4.2.2 关键函数分析145 格式转换与视频压缩195.1 格式转换19 5.1.1 RGB与YUV格式简介195.2 JPEG压缩20 5.2.1 JPEG与MJPEG文件格式简介20 5.2.2 JPEG库简介20 5.2.3 JPEG压缩的实现216 视频传输与网络视频服务器256.1 视频传输25 6.1.1 TCP/IP协议簇基础25 6.1.2 Linux Socket编程简介256.2 网络服务器26 6.2.1 多线程编程简介26 6.2.2 HTTP简介27 6.2.3 并发服务器线程实现28 6.2.4 HTTP请求响应线程实现307 调试方法与测试结果337.1 调试方法337.2 测试结果338 总结与展望358.1 总结358.2 展望35参考文献37致 谢38附录A 主函数代码39附录B 显示主页的HTML代码44附录C 实物图451 绪论1.1 视频监控发展现状和趋势近三十年来,视频监控系统的发展十分迅速,总体来看,视频监控系统的发展大致可分为三代。第一代是模拟监控时代。模拟监控技术发展较早,在20世纪90年代以前,系统以模拟设备为主。模拟视频监控系统一般由监控前端、传输设备、控制设备以及显示设备组成。监控前端一般为模拟摄像机、云台、声光电报警设备和雨刷等。传输设备一般为传输视频的同轴电缆,远距离传输可采用模拟光纤或者利用光端机进行传输。控制设备主要是视频切换矩阵,采用键盘进行切换和控制,将需要监控的图像在指定的显示设备进行显示。显示设备主要包括图像的监视器、报警指示设备等。这类系统主要应用于小范围内的监控,如大楼监控等。监控图像一般只能在控制中心查看。有线模拟视频监控无法联网,只能以点对点的方式监视现场,并且布线工程量极大。第二代是半数字时代。20世纪90年代视频监控进入数字化阶段,随着计算机和多媒体处理技术的发展,人们利用多媒体控制主机或硬盘录像主机(DVR)进行数字化处理与存贮,将原来的磁带存储方式转变成数字存储录像,进行模拟数字转换并录像和显示,集合了录像机、画面分割器等功能,跨出数字监控的第一步,基于PC的多媒体监控系统由此产生。而该系统视频前端(如CCD等视频信号的采集、压缩、通讯)较为复杂,稳定性、可靠性不高,功耗高,结构复杂,价格高昂。PC机也需专人管理,操作较为繁琐。图像传输仅局限在局域网内传输,传输距离明显受限,并且模拟视频信号的衰减很严重,传输距离不能超过1000m,否则必须采用光纤传输,图像质量受环境干扰也较大。第三代是全数字时代。从2004年开始,随着网络带宽的提高和成本的降低、硬盘容量的加大和中心存储成本的降低,以及各种实用视频处理技术的出现,视频监控步入了全数字化的网络时代。近两年随着远程监控系统被越来越多的应用于各个领域,对视频监控系统的要求也越来越高:操作简单、实时可靠、多功能、数字化、经济实用的视频监控系统的开发和设计正越来越多地受到人们的瞩目。基于嵌入式技术的网络化视频监控系统应运而生。目前市场上的数字视频监控系统主要有三种,一种是基于PC机的远程视频监控系统,现场放置插有视频卡的PC机,视频的压缩与解压缩由视频卡来负责完成。其优点在于能实现在网上互联互通及授权客户直接访问,便于构建系统及方便联网,缺点是实用性较差,系统稳定性差,费用高,而且现场不能脱离PC机。另一种是通过在现场设置视频网络编码器,将模拟视频编码后上网传输,并在监控端设置的对应解码器上将网上传输的数字视频信号解码后进行监控。其优点在于现场不需要PC机支持,系统稳定性提高。缺点是只能实现一对一传输,较难实现授权客户直接访问和联网。随着技术的进步,市场上出现了一种新型的网络化远程视频监控,即基于嵌入式视频服务器技术的远程网络视频监控。现场采用的网络监控产品主要包括:网络摄像机、网络服务器、网络视频接入器等。网络视频服务器解决了视频流在网络上的传输问题,从图像采集开始进行数字化处理、传输,这样使得传输线路的选择更加多样。1.2 课题研究的意义视频监控系统是重要场所诸如电力、邮电、银行、交通、商场等需要信息广泛交流企业的生产与管理的必备系统。比如,对于银行系统而言,通过监控系统,可以对一些突发事件进行回放,很容易找到事件的相关责任人;在制造企业中,可以通过监控系统实现无人生产,对机器进行远程维修等。随着国民经济的发展,视频监控系统的应用已经越来越广泛。目前视频监控系统主要在以下领域中使用:l 对机要部门的监视、控制和报警,如档案室、文件室、金库、博物馆等l 工厂、市场等的监视,如工厂生产过程、市场、营业厅、货场等的监视l 对交通运输的监视,如公共交通、铁路车站、铁路调度等的监视l 用于安全报警,如防盗、防火等的报警l 家庭用户,随着人民生活水平的提高以及计算机的家庭普及率提高,家庭小型监控系统的需求量也变得越来越大在计算机未被广泛应用以及数字视频等理论研究尚未成熟以前,传统模拟监控系统占据了监控领域的主要位置。传统的模拟监控,通常是利用录像机将镜头的画面录下来以备查,而录像机录下来的图像,一是清晰度不够,二是查询麻烦,而且录像带的保存也是问题,尽管有着种种不足,但因为前几年的技术限制,这种模式的监控系统还是被普遍使用。随着网络、通信和数字信息技术的不断进步,监控系统的组成模式也在快速变化和发展中,当前网络技术与嵌入式系统技术的结合催生了全新的基于嵌入式WEB的监控系统。它向人们展示的是现代高科技的结晶,是网络技术与嵌入式系统技术的完美结合。基于嵌入式WEB监控系统由于把视频处理和WEB功能集成到一个体积很小的设备内,可以直接连入以太网,达到即插即看,省掉很多复杂的电缆,安装方便,用户无需专用软件。这些优点将使得基于嵌入式视频监控系统获得更广泛的应用。广阔的市场前景伴随着各项新技术的日益发展与成熟,这使得嵌入式视频监控系统的研究与开发具有重大的现实意义。2 方案选择与设计本章介绍了视频监控的两种构架方案:C/S方案和B/S方案。通过对两种构架方案的优缺点,以及各自的实现方案,开发难度等方面的对比,最终本设计选用了B/S方案。2.1 C/S方案C/S方案即Client/Server方案,客户端是一个应用程序,服务器在目标板上运行。在Windows平台微软提供了两种方案,DirecShow和VideoForWindows(简称VFW)。可以实现持多媒体信息的采集、压缩、解压和回放存。VFW已经过时,一般都采用DirecShow。在Linux平台上也需要QT设计GUI,使用SDL实现播放。二者客户端程序都需要专门开发,而且要使用面向对象语言开发,一般采用C+或者C#。总之,开发难度较大,PC机还需要安装专门软件,运行维护难度大。此外,要建立在小范围里的网络环境, 局域网之间还要再通过专门服务器提供连接和数据交换服务。因此本设计舍弃本方案。当然C/S方案也有其优势,其优势在于可以很好的利用客户端软件实现录像回放等视频管理。2.2 B/S 方案B/S 方案即Browser/Server方案,客户端为浏览器,服务器在开发板上运行。它是随着Internet技术的兴起,是对C/S结构的改进。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。B/S结构结合浏览器的多种Script语言(VBScript、JavaScript等)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。建立在广域网之上的, 不必是专门的网络硬件环境。因此B/S相比于C/S有更强的适应范围。B/S结构的优点总结如下: l 具有分布性特点,可以随时随地进行查询、浏览等业务处理l 业务扩展简单方便,通过增加网页即可增加服务器功能 l 维护简单方便,只需要改变网页,即可实现所有用户的同步更新。l 开发简单,共享性强如果不需要很完善的视频管理功能,B/S构架还是有着巨大的优势,本设计即采用B/S构架方案。B/S方案已经有很多非常方便的实现方案。如在开发板上运行servfox视频服务器,在PC机上运行spcaview来显示视频,但是servfox采用的是V4L,它与V4L2还是有很多地方不兼容。本设计以开源项目Mjpgstreamer为基础。它使用V4L2的接口,能实现视频服务器的功能。可以将视频通过网络传输到浏览器,VLC播放器,Windows的移动设备或者其他拥有浏览器的移动设备。2.3 系统总体方案(1) 系统拓扑结构系统拓扑结构如图1。系统采用B/S架构。视频由USB摄像头输入,支持市面上常见的输出格式为YUYV和MJPEG的摄像头。视频数据通过USB传输到开发板。客户端采用浏览器来浏览视频。用户在浏览器地址栏输入开发板IP地址和端口,通过用户名和密码验证后就可以在浏览器页面上看到监控的视频画面。而且采用并发服务器从而实现了多客户端也就是可以支持多个浏览器同时显示。图1 系统拓扑结构图(2) 系统程序流程系统程序流程如图2。首先是初始化,包括输入初始化和输出初始化。输入初始化,主要是调用V4L2对摄像头初始化,包括捕获视频尺寸等设置。输出初始化,主要是根据启动参数配置输出,比如主页文件的目录,使用的端口号等。接下来运行输入和输出函数,二者都会创建线程,并且会将线程从进程中独立出来。输入线程会创建抓图线程cam_thread。这个线程就是输入线程的主体,图2中标识了它是一个循环,只要用户没有按下Ctrl+C循环就会永远继续下去,图2中所有的循环体也都是这样。抓图函数uvcGrab以阻塞方式等待图像数据,当有一帧数据到达后先处理为JPEG文件,对于YUYV格式的图像数据先要转换成RGB格式,再调用libpeg压缩为JPEG文件,对于MJPEG格式的输入需要插入Huffman数据表。捕获并处理了一帧视频之后再通知所有等待数据的客户端线程。输出线程分为两大部分:并发服务器线程和客户端处理线程。并发服务器线程server_thread负责监听客户端请求,一旦有请求就创建一个新的客户端线程专门负责来自此客户端的HTTP请求。这样服务器线程就可以一直监听客户端请求,本设计设置的最大可以处理的客户端数为10。一个客户端线程client_thread只负责处理一个客户端响应,也就是只响应一个IP地址的请求。进入client_thread之后,由于本系统开启了用户验证,所以客户端线程首先会验证客户端输入的用户名和密码,如果验证成功,将会发送HTTP响应头。通过设置了一些响应头,使得服务器可以不断地发送JPEG数据给浏览器。pthread_cond_wait以阻塞方式等待一帧数据的到来,一旦有JPEG数据就马上把数据从全局缓冲区中取出,发送给浏览器。图2 系统程序流程图3 嵌入式Linux开发平台的搭建本章详述了嵌入式Linux开发平台的搭建,包括内核移植,根文件系统制作等。主要是为本系统开发搭建软件平台,对于嵌入式项目开发这是尤为关键的一步,需要充分考虑到后续应用程序设计开发中需要使用的资源。例如,本设计在内核版本的选择上,即充分考虑到对USB摄像头的驱动支持。3.1 FL2440开发板平台介绍3.1.1 S3C2440简介本系统使用了三星公司的S3C2440A微处理器为主控芯片,其内核为ARM920T,最高时钟频率533MHz,采用298引脚的BGA封装。该芯片具有MMU虚拟内存管理,独立的8K指令和8K数据缓存,支持DSP指令集,支持Cache,LCD控制器,NAND Flash控制器,3通道UART,4通道DMA,带脉宽调制的4路定时器,I/O端口,RTC (real time clock),8路10位ADC和触摸屏接口,IIC总线接口,IIS总线接口,USB主机,USB从机,SD座和多媒体卡接口,2路SPI和同步时钟发生器。3.1.2 板载资源介绍开发板上本设计用到的硬件资源主要有:l 64M字节SDRAM l 4M NOR Flashl 256M字节NAND Flash l 两个三线串口,一个TTL串口 l 一个100M网口,采用DM9000CEP,带联接和传输指示灯 l 四个USB HOST接口;一个USB Device接口 3.2 嵌入式系统的构建3.2.1 交叉编译工具链、NFS环境的搭建(1) 交叉编译工具链嵌入式软件开发采用的编译是交叉编译,即在一个平台上编译生成能在另一个平台上执行的代码。一般将进行交叉编译的主机称为宿主机,也就是普通的PC,而把程序实际运行的环境称为目标机,也就是嵌入式系统环境。而交叉编译工具链是在编译程序时用到的一系列工具,例如编译器、汇编器、链接器等。本文中使用的交叉编译工具链为arm-linux-gcc 4.4.3。arm-linux-gcc 4.4.3的安装步骤为:1)解压压缩包。# tar xvzf arm-linux-gcc-version C / 2) 添加交叉编译工具链的搜索路径到系统PATH环境变量#gedit /etc/profile添加pathmunge /opt/FriendlyARM/toolschain/4.4.3/bin3) 应用更改#source /etc/profile 。(2) NFS环境的搭建网络文件系统NFS最早是SUN开发的一种文件系统。NFS允许一个系统在网络上共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统的文件。Linux系统支持NFS,使用NFS的这种功能,就能很轻松地将宿主机上的文件挂载到嵌入式开发系统上去,这样不仅方便了嵌入式开发板对主机上文件地访问,而且极大地提高了嵌入式系统开发中应用程序的开发和调试效率。主机配置步骤:1)设置挂载目录#gedit /etc/exports添加“/ *”即挂载主机根目录下所有文件。2)#ntsysv level 33)按空格键选上netfs开发板配置步骤:1)修改启动文件,使开发板启动时就可以自动挂载网络文件系统。#gedit rootfs/etc/init.d/rcS添加mount -n -o nolock,rsize=1024,wsize=1024,timeo=15 10:/ /mnt。其中10是主机的IP地址。如果是在Windows中安装Linux虚拟机,则该地址为虚拟机中Linux的IP地址;如果主机是直接安装Linux操作系统,当然该地址就是主机的地址。3.2.2 linux内核的移植(1) 内核版本的选择飞凌公司提供的最高内核版本为2.6.28,是比较早期的版本,对摄像头的支持也不完善。本设计选用的内核版本为。(2) 内核的移植由于内核移植步骤很多,所以这里只列出主要的步骤。1)yaff文件系统支持关于yaff文件系统的介绍见3.2.3,此处只是说明怎样才能让内核支持yaff文件系统。首先下载最新的yafffs文件系统,解压后给内核打补丁:# cd yaffs2# ./patch-ker.sh c ./linux-/2) 修改Makefile,主要是配置平台和编译器# gedit Makefile将两行:ARCH ?= $(SUBARCH)CROSS_COMPILE ?=修改为:ARCH ?= armCROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-3)修改MTD分区。就像Windows中硬盘会有几个分区一样,开发板的Nand Flash也要分为几个区,主要是文件系统分区和内核分区。修改结构体mtd_partition smdk_default_nand_part ,使其与Bootleader中的分区配置一致。4)选择配置文件。由于内核中没有FL2440开发板的配置文件,所以本设计选择与其相近的开发板的配置文件,再以此为基础根据系统需求作相应调整。# make s3c2410_defconfig执行成功后会在内核目录下生成配置文件.config5)内核的配置,将所有USB摄像头驱动编译进内核。# make menuconfigDevice Drivers Multimedia support *Video capture adapters - * V4L USB devices - 将上面两个配置选项下的子选项全部选上,这样本系统基本上可以支持市面上所有的摄像头,而不仅仅局限于采用OV511,ZC03控制器的摄像头了。6)修改网卡驱动。内核支持的网卡驱动是DM9000AEP,开发板采用的是更具性价比的DM9000CEP。只需简单修改即可。步骤如下:#gedit drivers/net/dm9000.c修改dm9000_init_dm9000函数找到iow(db, DM9000_GPR, 0);/* Enable PHY */在后面添加:delay(20); /* wait for PHY power-on ready */再在iow(db, DM9000_NCR, 3); /* NCR (reg_00h) bit0 RST=1 & Loopback=1, reset on */之后添加:udelay(20); /* wait 20us at least for software reset ok */7)内核的编译# make zImage编译时间比较长,成功编译后在内核目录arch/arm/boot下会有zImage文件,即为可以下载到开发板上运行的内核镜像。3.2.3 根文件系统(1) 文件系统简介Linux 的根文件系统具有非常独特的特点,就其基本组成来说,Linux的根文件系统应该包括支持Linux 系统正常运行的基本内容,包含着系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件。l 基本的文件系统结构,包含一些必需的目录比如:/dev, /bin,/etc等l 基本程序运行所需的库函数,如Glibcl 基本的系统配置文件,比如rcS,inittab等脚本文件l 必要的设备文件支持:/dev/tty*,/dev/fd0l 基本的应用程序,如sh,ls,cp,mv等本设计采用的文件系统为YAFFS(Yet Another Flash Filing System),它是Charles Manning为Aleph One公司设计开发的,是第一种专门为NAND Flash设计的文件系统。(2) 根文件系统制作工具BusyBox的安装busybox是构造文件系统最常用的软件工具包。busybox包含了一些简单的工具,例如cat 和echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及telnet;因此busybox又称为Linux工具里的“瑞士军刀”。本设计采用busybox1.20.0,为最新版本。安装步骤如下:1)修改Makefile:ARM ?= armCROSS-COMPILE ?= arm-linux-2)配置。把BusyBox编译成静态链接的可执行文件,运行时才能独立于其他函数库,否则必须要其他库文件才能运行。步骤如下:#make menuonfig Busybox Settings -Build OptionsBuild BusyBox as a static binary (no shared libs)3)编译#make4)安装#make install(3) 搭建根文件系统1)创建目录。由于要创建的目录较多,为简化操作采用Shell脚本创建。创建脚本的步骤如下:#gdeit mkrootfs.sh输入以下脚本命令#!/bin/shmkdir rootfscd rootfsmkdir root dev etc bin sbin mnt sys proc lib home tmp var usrmkdir usr/sbin usr/bin usr/lib usr/modulesmkdir mnt/usb mnt/nfs mnt/etc mnt/etc/init.dmkdir lib/moduleschmod 1777 tmpcd .保存并成功执行后,就自动创建了rootfs、dev、lib等目录。2)将busybox编译后生成的_install目录下的所有文件复制到rootfs3)将examples/bootfloopy/etc下的所有文件复制到rootfs/etc下4)将系统/etc/passwd、/etc/group、/etc/shadow复制到rootfs/etc。 #cd rootfs/etc #cp /etc/passwd /etc/group /etc/shadow ./ 5)修改passwd。将passwd文件的第一行:root:x:0:0:root:/root:/bin/bash中的/bin/bash,改成/bin/ash,因为文件系统的bin目录下没有bash这个命令,而是用ash代替bash。6)修改inittab文件,内容如下:console:sysinit:/etc/init.d/rcS ttyS0:respawn:-/bin/sh console:askfirst:-/bin/sh :once:/usr/sbin/telnetd -l /bin/login :ctrlaltdel:/bin/umount -a r7) 修改fstab文件,内容如下:proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0 var /dev tmpfs defaults 0 08) 修改init.d/rcS文件,内容如下: PATH=/bin:/sbin:/usr/bin:/usr/sbin runlevel=S prevlevel=N umask 022 export PATH runlevel prevlevel mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts #echo /sbin/mdev /proc/sys/kernel/hotplug mdev -s mkdir -p /var/lock /bin/hostname -F /etc/sysconfig/HOSTNAME /sbin/ifconfig eth0 19 up/bin/mount -n -o nolock,rsize=1024,wsize=1024,timeo=15 10:/ /tmp/sbin/telnetd9). 修改profile文件,内容如下: # Ash profile # vim: syntax=sh # No core files by default #ulimit -S -c 0 /dev/null 2&1 USER=id -un LOGNAME=$USER PS1=uh W# PATH=$PATH HOSTNAME=/bin/hostname export USER LOGNAME PS1 PATH10)将交叉编译器的库拷贝到rootfs/lib 11)在dev目录下,创建两个设备节点: #mknod console c 5 1 #mknod null c 1 3(4) 制作yaff根文件系统镜像工具:mkyaffs2image-128M,命令如下:#./mkyaffs2image-128M rootfs rootfs.bin成功执行后得到的文件系统镜像为rootfs.bin下载到开发板的yaffs分区。结合之前的内核系统就可以运行了。需要注意的是串口工具不能再使用DNW了,否则会显示乱码。原因是busybox配置了很多新功能,比如采用不同的颜色显示不同类型的文件,而DNW不支持这些功能。可以改用超级终端或者PuTTY。移植成功后在PuTTY上显示的界面如图3。其中“yaffs:dev is 32505859 name is “mtdblock3” rw”表明文件系统移植成功。“input:Vimicro USB Camera (Altair) as /class/input/input0”表明摄像头已经成功挂载,其设备文件名为input0。“eth0:link up,100Mbps,full-duplex, lpa 0x45E1”表明网卡驱动成功。最后出现“rootFL2440-Chen /#”就表明系统运行成功,进入了控制台。之后是测试文件列表命令ls的输出结果。图3 启动后的串口输出界面4 视频采集本章主要介绍了Linux系统中视频设备的通用调用接口V4L2,通过它可以实现操作摄像头,获取视频数据。首先是介绍对视频设备的一般操作流程,之后对具体实现代码进行了详细的分析。4.1 V4L2简介V4L2(Vedio For Linux Two)是在Linux中操作音视频设备的一套统一的API, 是V4L的升级版。它是linux内核提供给用户空间的编程接口。V4L2可以分为三层。底层为音视频设备在内核中的驱动程序,如果是自己开发驱动就要实现这一层的底层函数,如打开,初始化等。上层是为用户编程提供的API,本设计中主要是调用该层的接口函数。中间层为VFS(Virtual File Systerm),连接底层和上层的,最大的作用是可以实现统一的接口调用。而对于用户编程来说,需要了解的就是如何使用系统提供的API。4.2 视频采集的实现4.2.1 视频采集流程视频设备的一般操作流程:1)打开设备文件。如以读写方式打开:fd=open(/dev/video0,O_RDWR)。2)查看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等功能。命令为VIDIOC_QUERYCAP。3)选择视频输入。一个视频设备可以有多个视频输入。命令为VIDIOC_S_INPUT。4)设置视频的制式和帧格式。制式包括PAL,NTSC,帧的格式包括宽度和高度等。命令分别为VIDIOC_S_STD,VIDIOC_S_FMT。5)向系统申请帧缓冲,一般不超过5个。命令为VIDIOC_REQBUFS。6)将申请到的帧缓冲映射到内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问。传统的文件访问方式,首先需要调用系统调用open打开设备文件, 然后调用read, write以及lseek等进行顺序或者随机的I/O访问,效率非常低的, 每一次I/O操作都需要一次系统调用。 另外, 如果若干个进程访问同一个设备文件, 每个进程都要在自己的地址空间维护一个副本, 浪费了内存空间。因此本设计采用更为高效的内存映射mmap()。7)将申请到的帧缓冲插入队列,存储采集到的数据。命令为VIDIOC_QBUF。8)开始视频采集。命令为VIDIOC_STREAMON。9)从队列中取出已采集到数据的帧缓冲。命令为VIDIOC_DQBUF。10)将帧缓冲重新插入队尾,这样可以循环采集。命令为VIDIOC_QBUF11)停止视频的采集。命令为VIDIOC_STREAMOFF。12)关闭视频设备。如close(fd)。4.2.2 关键函数分析(1) 摄像头初始化函数init_v4l2static int init_v4l2(struct vdIn *vd)/ 用来描述摄像头信息的结构 int i; int ret = 0; /*1:打开设备*/ if (vd-fd = open(vd-videodevice, O_RDWR) = -1) perror(ERROR opening V4L interface); return -1; /*2:获取摄像头设备属性*/ memset(&vd-cap, 0, sizeof(struct v4l2_capability); ret = ioctl(vd-fd, VIDIOC_QUERYCAP, &vd-cap); if (ret videodevice); goto fatal; if (vd-cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) = 0) fprintf(stderr, Error opening device %s: video capture not supported.n, vd-videodevice); goto fatal; if (vd-grabmethod) if (!(vd-cap.capabilities & V4L2_CAP_STREAMING) fprintf(stderr, %s does not support streaming i/on, vd-videodevice); goto fatal; else if (!(vd-cap.capabilities & V4L2_CAP_READWRITE) fprintf(stderr, %s does not support read i/on, vd-videodevice); goto fatal; /*3:设置摄像头输出参数*/ memset(&vd-fmt, 0, sizeof(struct v4l2_format); vd-fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vd-fmt.fmt.pix.width = vd-width; /捕获视频横向像素 vd-fmt.fmt.pix.height = vd-height; /捕获视频纵向像素 vd-fmt.fmt.pix.pixelformat = vd-formatIn;/捕获视频格式YUV/MJPEG vd-fmt.fmt.pix.field = V4L2_FIELD_ANY; ret = ioctl(vd-fd, VIDIOC_S_FMT, &vd-fmt); if (ret fmt.fmt.pix.width != vd-width)|(vd-fmt.fmt.pix.height != vd-height) fprintf(stderr, format asked unavailable get width %d height %d n, vd-fmt.fmt.pix.width, vd-fmt.fmt.pix.height); vd-width = vd-fmt.fmt.pix.width; vd-height = vd-fmt.fmt.pix.height; /*4:设置帧率*/ struct v4l2_streamparm *setfps; setfps = (struct v4l2_streamparm *) calloc(1, sizeof(struct v4l2_streamparm); memset(setfps, 0, sizeof(struct v4l2_streamparm); setfps-type = V4L2_BUF_TYPE_VIDEO_CAPTURE; setfps-parm.capture.timeperframe.numerator = 1; setfps-parm.capture.timeperframe.denominator = vd-fps; ret = ioctl(vd-fd, VIDIOC_S_PARM, setfps); /*5:申请帧缓冲 这里NB_BUFFER预先定义为4,也就是四重缓冲*/ memset(&vd-rb, 0, sizeof(struct v4l2_requestbuffers); vd-rb.count = NB_BUFFER; vd-rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vd-rb.memory = V4L2_MEMORY_MMAP;/内存映射方式 ret = ioctl(vd-fd, VIDIOC_REQBUFS, &vd-rb); if (ret memi*/ for (i = 0; i buf, 0, sizeof(struct v4l2_buffer); vd-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋买卖合同简易版范本格式
- 肥料运输合同2024年
- 房产赠与合同公证的步骤
- 2024汽车买卖合同写
- 建筑企业分公司协议-合同范本
- 2024【承包厂食堂合同范本】关于医院食堂承包的合同范本
- 权威汽车买卖合同样式集
- 2024年电商托管代运营协议
- 2024音像制品经销合同范本
- 施工机械安全租赁协议
- 装饰装修工程售后服务具体措施
- 乙炔发生器、电石库安全检查表
- 克拉申监控理论述评
- ICH技术指导原则概述
- (完整版)一年级家长会PPT模板
- 《中华商业文化》第七章
- 15D503利用建筑物金属体做防雷及接地装置安装图集
- 消防训练工作研讨材料
- 第六章-机车转向架课件
- 医患双方权利和义务课件
- 高三年级班级成绩分析报告
评论
0/150
提交评论