随着计算机技术和网路技术的发展,在单片机领域也发生着日新月异的改变,如高速讯号处理器、SoC片上系统等新技术、新应用如雪后莴笋般蓬勃发展上去。在现实生活中时常会碰到这样一些问题:例如怎样对机房的温温度进行远程监控;怎么一手把握家里的安全状况,这都须要应用一种耗电量小、24小时不间断工作,容积小的远程视频监控系统。
针对网路视频监控设备的实际应用需求,结合图象采集压缩编码、嵌入式系统和网路技术等几方面的新技术,设计了一套嵌入式网路视频监控系统,用以实现视频数据的采集、压缩与网路传输。该系统基于S3C2410的ARM920920T芯片和嵌入式Linux操作系统,采用USB摄像头捕捉视频,经MPG440芯片压缩编码,系统直接与网路相连,用户使用标准的网路浏览器和流媒体播放程序即可查看远程视频影像。
1系统总体设计系统总体设计包括硬件设计和软件设计2部份。硬件设计模块主要包括微控制器模块、压缩编码模块、网络插口模块3部份。微控制器模块主要由主控芯片、DATAFLASH和SDRAM组成。其中,主控芯片是整个控制系统的核心,它负责整个系统的调度工作。DATAFLASH中固化了嵌入式Linux内核及其文件系统、应用软件和系统配置文件。SDRAM作为显存供系统运行使用。压缩编码模块由视频数据采集芯片、MPEG-4压缩编码芯片、SDRAM组成,负责将视频流转化为MPEG-4帧率。网路插口模块主要是配合主控芯片传送MPEG-4码率。当系统启动时,微控制器将Linux内核调入SDRAM中,系统从SDRAM中启动。系统启动后,微控制器控制MPEG-4编码模块进行工作。软件设计部份主要包括嵌入式Linux移植、视频采集与MPEG-4压缩编码模块、JRTPLIB网路传输模块和MPEG-4解码程序4部份。嵌入式Lin-ux系统储存到由S3C2410控制的DATAFLASH中,它负责整个系统软件的调度工作。MPEG-4压缩编码模块主要负责将采集到的视频流压缩为MPEG-4数据流。JRTPLIB网路传输模块主要负责MPEG-4视频流传输与控制的相关设置。MPEG-4解码程序主要负责对通过网路得到的MPEG-4数据流进行解码工作。
2硬件系统设计系统的硬件平台采用Samsung公司的处理器S3C2410。该处理器内部集成了ARM公司ARM920920T处理器核的32位微控制器,资源丰富:带独立的16kB指令Cache和16kB数据Cache,还有LCD控制器、RAM控制器、NAND闪存控制器、3路UART、4路DMA、4路带PWM的Timer、并行I/O口、8路10位ADC、TouchScreen插口、I2C插口、I2S插口、2个USB插口控制器、2路SPI,显存最高可达203MHz。在处理器丰富资源的基础上,还进行了相关的配置和扩充,平台配置了16MB,16位的FLASH和64MB,32位的SDRAM。通过以太网控制器芯片DM9000扩充了一个网口,另外引出了一个HOST、USB插口,通过在USB插口北外接一个带USB插口的摄像头。硬件系统结构如图1所示。
3软件系统设计
Linux具有内核小,效率高,源代码开放,内核直接提供网路支持等优点。但嵌入式系统的硬件资源虽然有限,因而不能直接把Linux作为操作系统,要针对具体的应用通过配置内核、裁减shell和嵌入式C库对系统进行订制,使整个系统才能储存到容量较小的FLASH中。Linux的动态模块加载,使Linux的裁减极为便捷,高度模块化的部件使添加特别容易。嵌入式Linux系统主要由4个部份组成:引导内核启动的文件(bootloader)、Linux内核文件(kernel)、虚拟c盘文件(ramdisk)、用户空间文件(user)。它们分别被置于DATAFLASH内的4个分区模块中。依据不同模块的具体功能采用不同的文件系统,如:bootloader,kernel,ramdisk等,移植完成后不须要动态改变,使用较节约空间的ROM-FS只读文件系统;user模块内放置一些可以动态更新的配置文件等,须要进行较多的读写操作,所以使用支持动态擦写保存的JFFS2文件系统。基于Linux的上述优点,实现的平台使用操作系统μclinux。一般嵌入式系统软件的开发采用交叉编译调试方法。宿主机一般为Intel处理器,而目标板如图1所示为S3C2410,因而程序须要使用针对处理器特性的编译器能够生成在相应平台上可运行的代码。对于嵌入式Linux,宿主机PC上应安装Linux系统,然后在宿主机上构建交叉编译调试的开发环境。采用移植性很强的C语言在宿主机上编撰视频采集程序,再借助交叉编译调试工具编译链接生成可执行代码,最后向目标平台移植。
Linux移植技术早已成熟,在此不做详尽论述,主要介绍USB摄像头驱动、基于V4L设计的视频采集模块和JRTPLIB网路传输模块的程序设计。
3.1USB摄像头驱动
搭建好嵌入式Linux的开发环境后,第一步工作就是USB摄像头的安装与驱动。
在Linux下,设备驱动程序可以看成是Linux内核与外部设备之间的插口。设备驱动程序向应用程序屏蔽了硬件实现的细节,致使应用程序可以像操作普通文件一样来操作外部设备linux 视频采集 软件,可以使用并操作文件中相同的、标准的系统调用插口函数来完成对硬件设备的打开、关闭、读/写和I/O控制操作,而驱动程序的主要任务也就是要实现这种系统的调用函数。
Video4Linux(V4L)是Linux中关于视频设备的内核驱动,它是针对视频设备应用程序编程提供的一系列插口函数。对于USB口摄像头,其驱动程序中须要提供基本的I/O操作插口函数open,read,write,close来实现。当应用程序对设备文件进行系统调用操作时,Linux内核将通过file-operations结构访问驱动程序提供的函数,在系统平台上对USB口数码摄像头进行驱动,首先把USB控制器驱动模块静态编译进内核,使平台中支持USB插口,再在须要使用摄像头采集时linux 视频采集 软件,使用insmode动态加载其驱动模块,这样摄像头就可正常工作。
确定USB摄像头被正常驱动后北京linux培训,下一步就是使用Video4Linux提供的API函数集来编撰视频采集程序。
3.2基于V4L设计的视频采集模块在Linux下,所有外设都被看成是一种特殊的文件,称为设备文件。系统调用的是内核与应用程序之间的插口,而设备驱动程序则是内核与外设之间的插口。他完成设备的初始化和释放,对设备文件的各类操作和中断处理等功能,为应用程序屏蔽了外设硬件的细节,使应用程序可以像普通文件一样对外设进行操作。Linux下的视频采集过程如图2所示。
Linux系统中的视频子系统Video4Linux为视频应用程序提供了一套统一的API,视频应用程序通过标准的系统调用即可操作各类不同的视频捕获设备。Video4Linux向虚拟文件系统注册视频设备文件,应用程序通过操作视频设备文件实现对视频设备的访问。
在此主要针对设备文件/dev/video进行视频捕捉方面的程序设计。其中用到的主要函数有:
Camera_open():拿来开启视频设备文件,使用前须要首先声明一个video_device类型的设备文件。
Camera_get_capability():通过调用ioctl()函数取得设备文件的相关信息,并存放在video_capability结构中。
Camera_get_picture():通过调用ioctl()函数取得图象的相关信息,但是储存到video_picture结构中。
Camera_close():拿来关掉设备文件。
Camera_grab_image():拿来抓取图象,采用mmap方法,直接将设备文件/dev/video0映射到显存,加速文件I/O操作,还可以使多个线程共享数据。剩下的还有设备初始化、参数设备等相关函数,这儿不再深究。
3.3视频压缩编码模块
获取图象数据后,可以直接输出到FrameBuffer进行显示,因为该系统要将采集到的视频影响通过网路传输出去,所以在传输之前要对原始的图象数据进行压缩编码,在此选用映佳公司的MPG440芯片来实现MPEG-4视频编解码方案。与其他标准相比,MPEG-4压缩比更高,节约储存空间,图象质量更好,非常适宜在低带宽条件下传输视频,并能保持图象的质量。对视频流进行压缩编码之后,接出来就要实现网路传输部份的功能。
3.4JRTPLIB网路传输模块流媒体指的是在网路中使用流技术传输的连续时基媒体,RTP是目前解决流媒体实时传输问题的最好办法,JRTPLIB是一个面向对象的RTP库,他完全遵守RFCl889设计redhat linux 下载,下边述说怎样在Linux平台上运用RTP合同进行实时流媒体编程。
3.4.1初始化
在使用JRTPLIB进行实时流媒体数据传输之前,首先应当生成RTPSession类的一个实例来表示这次RTP会话,之后调用Create()方式来对其进行初始化操作。RTPSession类的Create()方式只有一个参数,拿来指明这次RTP会话所采用的端标语。
3.4.2数据发送
当RTP会话成功构建上去以后,接出来就可以开始进行流媒体数据的实时传输了。首先须要设置好数据发送的目标地址,RTP合同容许同一会话存在多个目标地址,这可以通过调用RTPSession类的AddDestination()、DeleteDestination()和ClearDestinations()技巧来完成。目标地址全部指定以后,接着就可以调用RTPSession类的SendPacket()方式,向所有的目标地址发送流媒体数据。?
3.4.3数据接收
对于流媒体数据接收端,首先须要调用PollData()方式来接收发送过来的RTP或则RTCP数据报。因为同一个RTP会话中容许有多个参与者(源),因而既可以通过调用GotoFirstSource()和GotoNextSource()方式来遍历所有的源,也可以通过调用GotoFisstSourceWithDat()和Got-oNextSourceWithData()方式来遍历这些携带有数据的源。在从RTP会话中检测出有效的数据源以后,接下去就可以调用RTPSession类的Get-NextPacket()方式从中抽取RTP数据报,当接收到的RTP数据报处理完以后,要及时释放。
JRTPLIB为RTP数据报定义了3种接收模块,通过调用RTPSession类的SetReeeiveMode()方式可以设置下述这种接收模式:
RECEIVEMODE_ALL:缺省的接收模式,所有抵达的RTP数据报都将被接受;RECEIVEMODE_IGNORESOME:不仅个别特定的发送者之外,所有抵达的RTP数据报都将被接受,而被拒绝的发送者列表可以通过调用AddTo-IgnoreList(),DeleteFromlgnoreList()和ClearIgnoreList()方式进行设置;RECEIVEMODE_ACCEPTSOME:不仅个别特定的发送者之外,所有抵达的RTP数据报都将被拒绝,而被接受的发送者列表可以通过调用AddTo-AcceptList(),DeleteFromAcceptList和ClearAcceptList()方式来进行设置。
3.4.4控制信息
JRTPLIB是一个高度封装后的RTP库,只要PollData()或SendPacket()方式被成功调用,JRTPLIB就能否手动对达到RTCP数据报进行处理,而且都会在须要的时侯发送RTCP数据报,进而才能确保整个RTP会话过程的正确性。在系统中,使用RTPSessionJRTPLIB解释器提供的方式来实现底层的RTP/RTCP操作,但是把他封装在CrtpTransmitter类中,该类从MediaSink类承继而至,接收到相应的媒体帧数据,使用RTPSession泛型的操作把数据发送到网路上。
4结语
由于系统是以S3C2410平台和Linux操作系统为基础,借助Video4Linux设计采集程序,使用MPEG-4压缩编码,通过实时流媒体传输技术实现网路传输的,所以软硬件成本低廉,容积精巧,整个系统具有稳定可靠、安装简便等特征,并且监控距离可随网路延展不断加长,具有良好的发展应用前景。可扩充应用在工业控制、视频大会系统、可视电话、远程监控系统等众多领域。