admin 管理员组

文章数量: 887021


2024年1月13日发(作者:网络爬虫基本工作原理)

000

目录

第一章绪论.................................................................................................................... 1

1.1研究背景.......................................................................................................... 1

1.2无线视频监控应用开发意义.......................................................................... 1

第二章嵌入式无线视频监控系统总体方案设计........................................................ 2

2.1总体框架设计.................................................................................................. 2

2.2系统硬件构成.................................................................................................. 3

2.3系统应用软件设计.......................................................................................... 5

2.4本章小结.......................................................................................................... 6

第三章嵌入式Linux操作系统及开发环境的建立 .................................................... 6

3.1嵌入式Linux操作系统 .................................................................................. 6

3.2交叉开发环境的建立...................................................................................... 7

3. 2. 1 GNU开发工具集 ............................................................................ 8

3.2.2建立宿主机交叉开发环境................................................................... 9

3.3基于嵌入式Linux的上层软件开发模式 .................................................... 10

3. 3. 1应用程序的开发............................................................................... 10

3.3.2应用程序的调试................................................................................. 10

第四章视频数据采集与处理...................................................................................... 11

4.1嵌入式Linux下的视频采集模块软件设计 ................................................ 11

4. 1. 1 USB摄像头驱动程序加载 .............................................................. 12

4. 1. 2基于V4L模块的程序开发 ............................................................. 13

4.2图像识别报警模块软件设计........................................................................ 16

4. 2. 1基本结构与算法原理....................................................................... 17

4.2.2基于边缘的背景去除算法的原理与实现......................................... 18

4. 2. 3语音采集与报警的实现................................................................... 20

4.3图像数据压缩模块软件设计........................................................................ 22

4.3.1 MPEG-4压缩理论与实现 ................................................................. 22

4.4本章小结................................................................................................ 27

第五章网络视频传输模块软件设计.......................................................................... 27

5.1流媒体传输控制协议栈................................................................................ 27

5.2 RTP/RTCP协议分析与实现...................................................................... 29

5. 2. 1 R丁P协议分析............................................................................... 29

5. 2. 2 RTCP协议分析 ................................................................................ 30

5. 2.3 RTP/RTCP协议的软件设计与实现................................................. 31

5.3基于RTP/RTCP的MPEG一4传输技术................................................... 35

5. 3. 1 RTP有效载荷的确定....................................................................... 35

5. 3. 2 VOP的封装算法.............................................................................. 36

5.4 RTSP服务器建立 ...................................................................................... 37

5. 4. 1 R丁SP协议概述 ............................................................................ 37

5. 4. 2 RTSP的消息 .................................................................................... 38

5. 4. 3 SDP会话描述协议 .......................................................................... 38

5. 4. 4 RTSP的方法 .................................................................................... 39

5.4.5监控系统中R下SP服务器的设计与实现 ..................................... 40

0 0000

000

5.5本章小结........................................................................................................ 44

第六章 总结与展望.................................................................................................... 44

6.1论文总结........................................................................................................ 44

6.2研究展望........................................................................................................ 44

参考文献...................................................................................................................... 45

0 0000

II

000

第一章绪论

1.1研究背景

现在每个人都生活在嵌入式产品的世界里,在手表、手机、照相机、汽车,甚至运动鞋里都有嵌入式系统的身影。嵌入式系统小到一个芯片,大到一个标准的PC板,种类繁多,形式各异。事实上,嵌入式设备在数量上远远超过了各种通用计算机。PC的各种输入输出和外部设备均是由嵌入式处理器控制的,每台PC的外部设备中包含了5 ^J10个嵌入式微处理器,而一些高档汽车中则包含了30到50个甚至更多的嵌入式微处理器,在工业流水线控制、通讯、仪器仪表、船舶、航空航天、军事装备等领域更是嵌入式计算机的天下。

嵌入式系统的发展离不开通信和网络等技术的支持,嵌入式设备的联网成为必然趋势。面向21世纪的嵌入式系统要求配备标准的一种或多种网络通信接口,如IEEE1394,USB, CAN, IrDA或Bluetooth, GPRS等无线网络接口,同时也需要提供相应的通信组网协议软件和物理层驱动软件,在这样的趋势下,嵌入式Internet (Embedded Internet )技术应运而生。

嵌入式Internet是指设备通过嵌入式模块而非PC接入Internet,以Internet为介质实现信息交互的技术。例如,工业远程监测系统是利用Internet技术和总线控制技术实现远程数据采集、分析并实时监控设备运行,从而降低成本,提高效率;手持智能设备通过GPRS等无线接入方式和Internet相连,代替PC在Internet进行个人数据传输、处理和存储,如收发邮件,下载资料,即时聊天等;远程视频监控系统是利用Internet以及视频压缩等技术将实时视频数据传到监控中心,其应用范围极为广泛。嵌入式Internet带来的不仅是传输方式的改变,更重要的是拓宽了传统设备信息交流的范围。通过Internet,任何地点,任何时间,任何两个设备的信息交换都将成为可能,从而真正步入了“信息化”社会。

1.2无线视频监控应用开发意义

研究表明,人类通过视觉所获取的信息约占到其获取的总信息量的70%,视觉信息具有直观、可靠等一系列优越性。近年来,随着计算机、网络及通信技术的迅猛发展,整个世界对网络视频方面的投入逐年加大,相关应用也越来越广泛,形成了具有巨大发展潜力的市场,日益受到人们的重视和关注。

视频监控系统的发展基本上是从早期的模拟闭路电视监控系统向数模结合的视频监控系统和现在的数字视频监控系统演变的过程。其中,利用网络实现视频监控已成为一种趋势,传统的模拟视频监控技术正在逐步向数字化、网络化、智能化、无线化发展。可以说,视频监控进入了全数字化的网络时代。

模拟视频监控系统中的信息流为模拟的视频信号,系统的网络结构主要是一种单功能、单向的信息采集网络,因此系统尽管已发展到很高的水平,己无太多 0 0000

1

000

潜力可挖,其局限性依然存在。模拟监控系统的主要缺点有:

(1)通常只适合于小范围的区域监控。模拟视频信号的传输工具主要是同轴电缆,而同轴电缆传输模拟视频信号的距离不大于1 Km,双绞线的距离更短,这就决定了模拟监控只适合于单个大楼、小的居民区以及其它小范围的场所;

(2)系统的扩展能力差。对于已经建好的系统,如要增加新的监控点,工程繁琐复杂,新的设备也很难添加到原有的系统之中;

(3)无法形成有效的报警联动,由于各部分独立运作,相互之间的控制协议很难互通,联动只能在有限的范围内进行。

数字视频监控系统将系统中信息流(包括视频、音频、控制等)从模拟状态转为数字状态,根本上改变视频监控系统从信息采集、数据处理、传输、系统控制等的方式和结构形式。信息流的数字化、编码压缩、开放式的协议,使视频监控系统与安防系统中其它各子系统间实现无缝连接,并在统一的操作平台上实现管理和控制。

在国内外市场上,主要推出的是数字控制的模拟视频监控和数字网络视频监控两类产品。前者技术发展已经非常成熟、性能稳定,并在实际工程应用中得到广泛应用;后者是新近崛起的以计算机技术及图像视频压缩为核心的新型视频监控系统,该系统解决了模拟系统部分弊端而迅速崛起,但仍需进一步完善和发展。嵌入式方式的视频监控系统主要是以嵌入式视频服务器方式提供视频监控。其具有布控区域广阔、几乎无限的无缝扩展能力、易于组成非常复杂的监控网络、性能稳定可靠等特点,必将成为今后视频监控领域的主流产品。本文的工作就是开发一套基于ARM处理器和USB摄.像头的嵌入式无线网络视频监控系统。

本文所设计的嵌入式无线视频监控系统顺应视频监控系统的发展趋势,结合先进的视频压缩技术和网络传输协议,并将近几年来,逐渐成熟的无线通讯技术运用到视频监控中,具有一定的理论和实践价值。需要指出的是,由于现在的GPRS网络稳定性和覆盖范围的局限,这里考察的这类无线监控系统还没有真正得到商业上的大规模应用。但是,相信随着无线网络的建设,特别是第三代移动通信网络的建设和成熟,此系统在不远的将来一定会得到广泛的应用。

第二章嵌入式无线视频监控系统总体方案设计

嵌入式无线视频监控系统涉及通信技术和视频压缩技术等多方面要点,良好的总体方案设计是系统开发成功的关键,本章提出系统设计的总体方案,分别从硬件方案和软件方案两个方面介绍。

2.1总体框架设计

视频监控系统的一般过程是:在一些重要的场所安放一个或若干个摄像机拍摄监控现场,然后将视频信号通过一定的传输介质传到指定的监控中心实时播放,或是再通过存储设备,将媒体存储到存储介质上,同时还可以根据不同需要和途径在现场安装其它的探测装置作为监控系统的辅助设备,如温湿度传感器、声音报警装置等。根据视频监控系统的特点构建系统总体框架如下:

0 0000

2

000

图2. 1监控系统总体框架设计

整个无线视频监控系统由嵌入式微处理器系统和被控对象组成,嵌入式微处理器系统是整个系统的核心,由硬件层、中间层、软件层和功能层组成。其中软件层完成监控系统的视频图像,音频数据的采集压缩,识别报警等功能,并为构建流媒体服务器实现网络通信协议;被控对象则是USB摄像头、GPRS无线网络连接模块,声音接收器和其他监测传感器等,它们接收嵌入式微处理器系统发出的控制命令,执行所规定的操作或任务。

2.2系统硬件构成

整个嵌入式无线视频监控系统主要由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及应用软件等几部分组成。

嵌入式微处理器方面,RISC技术推动着计算机体系结构从封闭的CISC向开放的结构发展。全球各大CPU芯片制造厂商争相开发生产RISC芯片,目前的典型结构为ARM系列、MIPS和SH}I}。一般的嵌入式实时操作系统都支持上述微处理器。ARM公司是一家IP供应商,其核心业务是IP核以及相关工具的开发和设计。ARM公司的IP核也由ARM7 } ARM9发展到今天的ARM

11版本。

一般而言计算机体系架构设计主要由以下几部分组成:指令集设计,CPU核的设计,流水线技术,存储器层次结构设计,I/O系统设计。RISC思想的提出从简化指令集的角度降低了微处理器的开发难度和成本,同时提高微处理器的并行度。

ARM微处理器特点:体积小、低功耗、低成本、高性能;支持Thumb (16 0 0000

3

000

位)/ARM (32位)双指令集,能很好地兼容8/16位器件;大量使用寄存器,指令执行速度更快;大多数数据操作都在寄存器中完成;寻址方式灵活简单,执行效率高;指令长度固定。

ARM体系的设计是基于RISC思想的,其代码密度性能介于其他多数RISC微处理器和CISC微处理器之间。后来引入的Thumb指令集则大大提高了代码密度。ARM主要使用32位的RISC指令,但是指令代码利用率低,ARM为了弥补此不足,在新型ARM构架(V4T版本以上)定义了16位的Thumb指令集。另外,为了加速通信和多媒体中有关数字信号的处理,ARM微处理器在RISC的基础上增加了DSP核中的关键部件,双核协同工作[’]。

由于ARM架构的微处理器主要用于嵌入式系统,因此ARM构架在设计中十分注意低电压、低功耗处理,设计中采用了以下一些措施:降低电源电压;减少门的翻转次数,当某个功能电路不需要时,禁止门翻转;减少门的数目,即降低芯片的集成度;降低时钟频率。ARM的低功耗,使得ARM在专门针对嵌入式系统的微处理器市场中始终处于有利的地位。ARM还其他采用了一些特别的技术,在保证高性能的前提下尽量缩小芯片的面积。目前广泛应用的ARM微处理器有ARM7系列、ARM9系列、ARM9E系列、ARM 1 QE系列、SecurCore系列和Intel StrongARM, Xscale系列。

鉴于ARM微处理器的众多技术和市场优势,本系统硬件设计中,选用了一款带有ARM处理器的嵌入式评估板,如图2.2所示。该硬件平台采用Intel Xscale结构的PXA255嵌入式微处理器。硬件平台上的重要部件有晶振(时钟)电路,复位电路,键盘、LED等人机交互接口,JTAG接口电路,存储系统采用了64MB的nand Flash和32MB的SDRAM。为方便接入LAN网络,设计了RTL8019网络芯片接口电路}s}。本系统的GPRS应用设计采用的方式是将GPRS模块独立设计,与嵌入式硬件平台通过DART接口经电平转换后的RS232接口相连。这种模块化的结构设计,可以降低硬件调试难度,同时也是基于硬件平台的可重用性考虑。

0 0000

4

000

图2. 2监控系统硬件结构图

2.3系统应用软件设计

系统的软件设计基于嵌入式Linux操作系统平台,系统软件结构模块如图2.3所示,整个系统根据功能分为4个独立的模块,各功能模块功能说明如下:

图2. 3应用软件功能模块

(1)视频音频采集模块。该模块用于完成对视频音频信号的采集,将USB摄像头和声音接收器采集到的信号以文件的形式保存或者放入缓冲区供其它模块使用。

(2)图像识别报警模块。该模块对采集得到的图像信息做识别处理,发现异常时则以彩信或声音的形式报警。

(3)图像压缩模块。该模块用于完成对图像数据的压缩处理,读取由视频采集模块产生的缓冲区数据,对其进行压缩处理后再以文件的形式保存或者将压缩数据放入缓冲区供其它模块使用。

(4)网络传输模块。该模块用于完成对视频数据的网络传输,读取由缓冲区里的视频数据,并将其打成RTP包,然后将其做成流式文件格式,通过内置的流媒体服务器传输到网络上。

0 0000

5

000

监控系统直接将数字视频信号采集编码,无需计算机的协助即可独立进行工作,并通过GPRS无线接入模块与Internet进行连接。系统内置网络视频服务器,用户通过各类GPRS智能终端以及标准的流媒体播放程序就可以根据IP地址对视频采集设备进行访问,观看通过无线GPRS网络传输的实时图像。同时监控系统具备智能图像识别功能,对定点场景的异常情况进行彩信,声音等形式的报警。

整个系统具有如下的特点:

(1)设备硬件核心采用基于Xscale系列的PXA255嵌入式芯片,系统软件使用嵌入式Linux系统,使得系统本身具有强大的处理功能,方便功能的扩展;

(2)视频采集采用具有USB接口的通用外置摄像头进行,使视频采集的通用性更好,软硬件设计容易,成本更低;

(3)软件部分采用模块化设计,各模块均可作为独立的子系统存在,增强的系统通用性、可升级性和可维护性;

(4)图像识别报警功能采用基于边缘检测的背景去除算法,对异常情况识别准确率高;

(5)采用先进MPEG-4视频压缩方式,适合无线网络传输的需要;

(6)联网方便,安装简易,充分利用GPRS永远在线等优点。

2.4本章小结

本章首先描述了嵌入式视频监控系统的总体设计框架,硬件开发平台的主要构成,并阐述了基于该硬件平台的依据和优势。然后设计了基于嵌入式Linux操作系统的应用软件框架,并指出了系统具备的特点。

第三章嵌入式Linux操作系统及开发环境的建立

采用Linux的嵌入式系统设计者可以利用开源代码的易得性、POSIX兼容性、坚实的可靠性以及大量的应用程序,而且没有许可费用。所有这些好处,再加上价格优势,使得Linux成为嵌入式操作系统的一个出色的解决方案。

3.1嵌入式Linux操作系统

嵌入式系统是以应用为中心,以计算机理论为基础,软件硬件可裁剪,适应系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统[6]。一般的嵌入式系统具有以下特征:系统内核小;专用性强;系统可裁剪以及实时操作系统(RTOS)的需求。

嵌入式操作系统EOS ( Embedded Operating System)是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括硬、软件系统)重要的组成部分,包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面的特点。

目前广泛应用的EOS产品包括VxWorks, WinCE, VRTX, PaImOS, pSOS,

Nucleus,Lynx , QNX等,这些RTOS都是商用的嵌入式操作系统,它们在系统可 0 0000

6

000

靠性和对用户的技术支持上都有优势。但是缺点是价格昂贵,核心源代码不公开,可移植性差,难以实现嵌入式系统要以最小的软硬件系统,最低的成本去完成目标功能这一特点。Linux系统与UNIX系统兼容,开放源代码。它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式设备。

由于Linux使用GPL(GNU General Public License),所以任何对将Linux定制于PDA或者其他移动设备的人都可以从Internet上免费下载其内核和应用程序,并开始移植或开发。许多Linux改良品种迎合了嵌入式/实时市场。它们包括 RTLinux(实时Linux ),uClinux(用于非MMU设备的Linux), Montavista

Linux(用于ARM, MIPS, PPC的Linux分发版)、ARM-Linux ( ARM上的Linux和其它Linux系统。Linux用于嵌入式领域的优势具体表现如下:

(1) Linux内核精简,各部分的功能明确,可扩展性强,容易剪裁。

(2)免费,可以极大幅度地降低产品成本,在价格上面拥有优势,只要不违反GPL协议,就可以自由发布和使用软件。

(3)代码开放,可以免费获得,有利于后来者学习,缩短开发过程。

(4) Linux符合IEEE POSIX编程标准,有非常好的可移植性和稳定的性能。

(5)支持TCP/IP协议,有强大的网络功能。

(6)丰富的开发工具和大量的文档。Linux提供C} C+十,Java以及其他很多的开发工具,这些工具可以被免费地使用。

当然,嵌入式Linux也存在其不足之处。在实时领域内,其实时性存在不足。Linux是一个分时系统,虽然实现了软实时性,在很多的情况下还是无法满足满足实时的需求。对于一些实时性要求强的环境需要改进。对于具体的应用还需要开发具体的启动程序、设备驱动程序和上层应用程序。这些程序是不具备通用性的,需要专门开发。

表3. 1嵌入式Linux与商业RTOS比较

3.2交叉开发环境的建立

Linux软件开发以native方式进行的,即本机开发、调试,本机运行的方式。 0 0000

7

000

这种方式通常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机运行开发工具和调试设备。嵌入式系统的软件开发采用交叉编译调试的方式,如图3.1.

图3. 1基于宿主机和目标板的交又开发环境

交叉编译调试环境建立在宿主机上,开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码,然后把可执行文件下载到目标机上运行。GNU所倡导的自由软件除了Linux操作系统外,GNU的软件还包括编译器(gcc,

g+十)、二进制转换工具(objdump, objcopy)、调试工具(gdb, gdbserver, kgdb)和基于不同硬件平台的开发库。

3. 2. 1 GNU开发工具集

交叉编译环境的建立最重要的就是要有一个交叉编译器。本系统开发用到的编译器是~-linux-gcc,它是gcc的~改版。编译器的生成依赖于相应的函数库。配置一个gcc的交叉编译器一般包含如下几个步骤:

(1)取得binutils, gcc, glibc的源码;

(2)配置并编译binutils,得到下一步要用到的汇编器和连接器;

(3)配置并编译gcc源代码,生成gcc编译器;

(4)配置glibc编译生成glibc的C函数库;

(5)再次配置并编译gcc源代码,生成其它语言的编译器如:c++等。

也可从网上直接下载相关的工具链(toolchain ) o arm-linux-toolchain包括一系列的开发调试工具17]。工具集如表3.2所示。

表3. 2 GNU工具集

0 0000

8

000

其中主要组件包括:

(1) arm-linux-gcc: ARM交叉编译器,可以以交叉编译的形式开发目标应用程序,即在宿主机上开发编译可在目标上运行的二进制文件。arm-linux-gcc的使用方法同标准gcc基本一样,可以参考GUN的gcc文档。

(2)辅助工具。包括~-linux-obj dump(可以反编译二进制文件),arm-linux-as(汇

编编译器),arm-linux-ld(连接器)。

(3) arm-linux-gdb(交叉调试器),可使用多种交叉调试方式,gdb-bdm(背景调试工具),gdbserver(使用以太网络调试)o ARM-Linux的打印终端通常情况下是串口,内核在启动时所有的信息都打印到串口终端(使用printf函数打印),同时也可以通过串口终端与系统交互。

3.2.2建立宿主机交叉开发环境

在进行应用程序开发之前,要在宿主机上建立和配置好开发应用程序所需要的开发环境。

(1)安装RedHat Linux9.0。需要选择定制(custom)安装,并且在定制时选择NFS(网络文件系统)和dialup workstation(拨号工作站);配置网络时,主机IP要与开发板的IP在同一子网内。

(2)安装工具链,即把toolchain压缩包解压到相应的目录下,默认的路径是/usr/local下,把~-linux工具链目录加入到环境变量PATH中,可实现~-linux-gcc编译器直接调用。

(3)安装ARM-Linux操作系统,即把ARM-Li~压缩包解压到相应目录下,采用下列命令安装到根目录下。

tar zxvf -C/

(4)配置NFS ( Network File System )。配置NFS的目的是让目标板通过网络映像宿主机硬盘,从而使宿主机的硬盘成为目标板的一个虚拟硬盘,这时你宿主机硬盘上的文件映射为目标板上某一目录中的文件。

(5)配置minicom( minicom作为目标板的显示终端,以监控目标板上程序的运行)。运行minicom-s进行配置,选择Serial port setup项,设置如下参数:

Serial Device: /dev/ttySO

Bps/ParBits: 115200 8N 1

Hardware Flow Control: no

Software Flow Control: no

0 0000

9

000

3.3基于嵌入式Linux的上层软件开发模式

3. 3. 1应用程序的开发

本系统在软件模块开发时采用了以下两种嵌入式Linux应用程序开发模式:

1.先在宿主机(Intel CPU)上调试通过后,再移植到PXA255评估板上。这种HOST方式下有gdb调试工具可用。移植的工作要解决一个函数库的问题。由于嵌入式Linux开发平台提供的工ibc库同标准的libc库有一些不同,在程序移植时可能会有函数未定义的问题。对于这种问题,就需要编制这些要用到却又未定义的函数。同时也需要改动Makefile以适应目标板。

2.利用NFS直接在目标板上开发

将宿主机和目标板通过串口相连,在宿主PC机上运行minicom作为目标板的显示终端,利用NFS在目标板端mount上宿主机硬盘,这样就可直接在目标板上调试宿主机硬盘中交叉编译好的应用程序。下面给出这种直接开发模式下的开发流程:

(1)用串口和网线将宿主机和目标板连接起来。要求宿主机安装了NFS

(2)在宿主机上编写应用程序,并进行交叉编译,生成可执行的文件。交叉编译可以用命令行的方式,如果有多个源文件,则可以通过编写Makefile来进行编译;

(3)将编译好的文件放到开启NFS服务的目录下

(4)在宿主机上启动minicom作为目标板的仿真终端

(5) mount映射宿主机硬盘根目录/到板子的/mnt目录下,例如:mount 192.

168.

0. 2://mnt

(6)在minicom下即可运行映射目录下的可执行文件

调试信息通过串口打印在宿主机的minicom屏幕上或记录在syslog文件中,这样便可进行应用程序的调试。假如程序运行不对,可方便切换到宿主机去编辑、编译,只要不重启开发板就不必再作任何操作,因为mount的宿主机硬盘上的应用程序会自动覆盖更新,再重新执行的就是更改后的新版本。这样反复调试、更改、编译再调试,而不必反复烧写开发板,直至程序工作正常,再将最终定版的映象文件烧写到开发板上。

3.3.2应用程序的调试

直接在目标板上调试应用程序采用以下三种方法:

(1)打印串口。这是嵌入式系统中最常用的调试手段,虽然简单但却有效实用。其实几种方法相比之下,最有效便捷的方法还是printf,尤其配合mount进 0 0000

10

000

行应用程序的调试。

(2)使用log记录文件。例如,使用syslog将应用程序运行过程中的中间信息全部v录在//var/log/syslog下。

(3) gdb调试。首先需要在板子上移植gdbserver,才支持通过以太网或串口远程调试。下面介绍以太网调试步骤:

先在目标板端启动gdbserver

cd /bin

gdbserver 192.168.0.2:7070 test

这里test为用户应用程序可执行文件名且已烧制在板子/bin目录下,7070为TCP端口号,宿主机通过这个端口与板子建立调试通道。端口号可任意选取,一般大于20000然后在宿主机侧键入下列命令:

cd /home/test

arm-linux-gdb

则进入gdb提示符:

(gdb) target remote 192.168.0.230:7070

该命令与板子建立TCP连接以进行调试,下一步进行调试时不要运行run,而应该用continue,即c。

要实现gdb(或ddd)的源代码级调试,必须在编译应用程序时打开一g参数。采用该选项进行编译,FLAT格式的可执行文件大小没有变化,只是.gdb文件变大,这样在gdb和ddd环境中就可以看到源代码。

3.5本章小结

本章首先介绍了嵌入式Linux的发展与特点,给出了交叉开发环境的建立方法,然后详细分析了内核的引导和启动过程以及内核移植、文件系统移植和Bootloader设计等嵌入式系统开发所涉及的重要环节,最后介绍了基于嵌入式Linux的上层软件开发模式。

第四章视频数据采集与处理

视频数据的采集是监控系统实现的第一步,也是图像识别和视频压缩的基础。本监控系统由多个子系统构成,在系统功能模块划分的基础上设计一个良好的应用程序结构和一系列符合视频数据特点的数据结构,并借助Linux多线程的程序设计方法和多种系统调用完成功能模块的软件设计是本章工作的重点。

4.1嵌入式Linux下的视频采集模块软件设计

本系统运行的平台是基于Xscale的嵌入式Linux系统。系统在启动后,启用了MMU,系统进入保护模式,所以应用程序就不能直接读写外设的v0区域(包括v0端口和vo内存),这时一般就要借助于该外设的驱动来进入内核完成这个工作。所以系统中的视频采集分为两步实现:一是为USB接口的数码摄像头在内核中写入驱动,二是编写上层应用程序获取视频数据。

0 0000

11

000

4. 1. 1 USB摄像头驱动程序加载

系统使用的是USB接口的外置数码摄像头,USB设备和嵌入式硬件开发平台构成了一个USB通信系统。Linux USB主机驱动由三部分组成[[13]。主机控制器驱动程序 ( HCD ) , USB驱动(USBD)、设备端驱动程序(Slave Device

Driver),相互关系如图4.1所示。

图4. 1 Linux USB驱动程序结构

HCD是USB主机驱动程序中直接与硬件交互的软件模块;USBD部分是整个USB主机驱动的核心,提供USB总线管理,带宽管理等;USB设备端驱动是最终与应用程序交互的软件模块,向应用程序屏蔽了硬件实现了的细节,使得应用程序可以像操作普通文件一样来操作外部设备,即可以使用和操作文件中相同的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和I/O控制操作。为应用程序提供访问接口。

对于 USB摄像头来说,其核心是感光芯片和数据处理DSP芯片。其中DSP芯片是影响摄像头视频采集速度以及相关性能的主要因素。本系统选用的是中星微zc301,用它将摄取的数字视频图像直接通过USB接口送入开发板进行处理。

这款芯片的特点是内含数字摄像IC接口,DRAM接口、实时图像压缩引擎、USB接口、FIFO等功能,通过采用影像光源自动增益补强技术,自动亮度、白平衡控制技术,色饱和度、对比度、边缘增强以及伽马矫正等先进的影像控制技术,搭配COMS感光芯片使各项技术指标都能与CCD芯片相媲美,因此,完全可以满足后面系统图像识别报警处理以及实时监控的需要。

在Linux下,对驱动程序的编译添加一般有两种方式[14]。可以静态编译进内核,再运行新的内核来测试;也可以编译成模块在运行时加载。第一种方法效率较低,但在某些场合是唯一的方法。模块方式调试效率很高,它使用insmod工具将编译的模块直接插入内核,如果出现故障,可以使用~od从内核中卸载模块。不需要重新启动内核。但嵌入式系统是针对具体应用的,所以本系统将linux下的zc301驱动程序通过menuconfig配置以及内核重编译将设备驱动程序以静 0 0000

12

000

态的方法编译进内核,再将带有zc301驱动的内核,将其烧写到开发板上即可使用。USB模块的视频数据流如图4.2所示。

图4. 2 USB模块的视频数据传输

4. 1. 2基于V4L模块的程序开发

Linux下的Video for Linux,简称V4L为市场现在常见的电视采集卡和并口及USB口的摄像头提供统一的编程接口【}s}。同时也提供无线电通信、文字电视广播解码和垂直消隐的数据接口。现在己经有了Video for Linux Two驱动,即V4L2,它解决了V4L中存在的一些问题,并提高了硬件性能。但是,目前V4L2仍然没有集成到Linux的内核中,因此,本系统的视频采集开发仍然是基于V4L的。Linux下与V4L相关的设备文件与其用途如表4.1所示。

表4. 1 V4L的设备文件与用途

USB摄像头在Linux中和打印机,鼠标一样,属于字符设备。其主设备号是810在嵌入式平台上使用USB摄像头时,先用mknod命令创建一个设备结点/dev/video0再用In命令建立该结点与/dev/v41/video0的连接。访问时,用open()打开设备/dev/video0即可。

利用V4L对USB摄像头的编程需要Li~下两个系统调用,分别是ioctl()调用和mmap()调用。

ioctl ( input/output control ) o ioctl系统调用的功能是通过打开的文件描述符对各种文件尤其是字符设备文件进行控制,完成特定的I/O操作。V4L支持的ioctl命令大概有二十几个[[16],在应用中主要用的是下面几个命令:

0 0000

13

000

表4. 2 V4L的主要控制命令

mmap调用的功能是实现内存映射,即将指定文件或对象的一部分映射到内存中去。这样可以通过访问特定的内存区域来直接对文件或对象进行存取。与:ead和write。调用相比,这种I/O方式效率更高。

mmap调用同样适用于设备文件,即可以用mmap调用将设备文件映射到内存中去,对设备文件的读写就转化为对内存的读写。对持续采集大量图像数据的摄像头来说,用mmap的内存映射方式来传送数据,更能体现效率。

mmap调用的格式是:

void* mmap(void* start,size t length,int prot,int flags,int fd,off t offset);

参数fd是被映射到内存文件的描述符;start指向欲对应的内存起始地址;length为映射到内存的文件大小;offset为目标文件中被映射部分起始点距文件开头的偏移量;mmap调用成功后,其返回值就是指向内存映射区域的指针,该内存区域的大小就是由length参数指定的字节长度,接着应用程序就可以对该区域进行存取操作。

V4L视频程序设计时必须声明两个头文件sys/types.h和linux/videodev.h,}

然后,遵循V4L给出video device数据结构的定义:

typedef struct v41 input]

int fd;

struct video- capability capability;/*设备的基本信息*/

struct video_picture picture;/*设备采集的图象的各种属性*/

struct video- mmap mmap;/*用于设置~ap*/

struct video一 mbuf mbuf;/*利用~ap进行映射的帧的信息*/

unsigned char *map;/*存放返回地址*/

char device[256];

int width;

int height;

struct frame * f;

pthreadwe tthread;

int cur frame;

int framestat[2];/*双缓冲*/

0 0000

14

000

}video_ device;

主要用到的采集操作函数定义如下:

int v41_ open(char *name } video device *vd);/*打开设备文件*/

int v41_ close(video_device *vd);/*关闭设备文件*/

int v41-get capability(video一evice *vd); /*取得设备文件的相关信息*/

int v41-get_pictwe(video_ device *vd); /*取得输入到摄像头的影像信息*/

int v41_ set}alette(v4ldevice *vd, int palette)/*设置采集图片格式*/

int v41_grab_ init(v41_ device *vd, int width, int height);/*采集初始化*/

int v41-grab frame(video一evice *vd, int frame); /*将影像放到mmap()映射的内存*/

int v41-grab_ sync(v41_ device *vd); /*同步,等待一帧影像采集的完成*/

int v41_ mmap(v41一evice *vd); /*内存映射*/

int v41-get mbuf(v41_ device *vd); /*得到用于内存映射的缓冲区信息*/

unsigned char *v41_get address(v41_ device *vd)/*将采集数据的起始地址以指针返回*/

图4. 2 V4L视频采集流程图

下面给出几个主要函数的实现:

(1)v41_ open()函数

#define DEFAULT DEVICE "/dev/video0"

int v41_ open(char *named video一 device *vd)

{

if (!dev)

dev=DEFAULTse DEVICE;

if ((vd->fd=open(dev} O- RDWR))<0)

return一1;

0 0000

15

000

if (v4lJget capability(vd))

return一1;

if (v41_,get-picture(vd))

return一1;

return 0;

}

这里先定义了常量DEFAULT DEVICE,作为默认的视频设备,当应用程序输入的dev设备文件参数不存在时,就使用“/dev/video0”这个默认值,设备文件开启后,将回传的文件描述符放到vd->fd里。

(2 ) v41-get一 capability()函数

int v41}et capability(video device *vd)

if (ioctl(vd->fd} VIDIOCGCAP, &(vd->capability))<0)

return一1;

else

return 0;

}

在v41 open()函数中可以看到,成功开启设备文件后,通过调用v41_get

capability()和v41_get}icture()两个函数来实现对设备的信息以及图像信息的获取。v41-get capability()函数通过调用ioctl()函数来取得设备文件的相关信息,并将取得的信息放到video- capability结构里。v41_get-picture()与此类似。

(3 ) v41 mmap()函数

int v41一 mmap(v4ldevice *vd)

if(v4lJget mbuf(vd)<0)

return一1;

if((vd->map=mmap(0, vd->, PROT_READ}PROTes WRITE, MAP

SHARED, vd->fd,

0))<0)

return一I;

else

return 0;

这里首先用要v41_getes mbuf()函数得到映射缓冲区的信息,如缓冲区的大小mbuf. size,然后,利用前面介绍的~ap()函数将摄像头文件和内存缓冲区建立连接。捕捉到的图像帧被存放到内存映射区后,要对其进行处理就必须访问该内存映射区,包括图像识别或压缩处理。

4.2图像识别报警模块软件设计

根据系统应用功能设计,本监控系统要对实时图像进行检测,当有异常发生时,通过GPRS模块的Internet无线接入,将异常图像以彩信邮件方式及时、准确的发送到用户的手机屏幕上、电子邮箱中或监控中心的电脑屏幕上,达到无线 0 0000

16

000

远程监控以及智能报警的目的。

4. 2. 1基本结构与算法原理

这部分模块的功能结构如图4.3所示。其中图像识别单元,声音报警单元是下面将要介绍的。

图4. 3图像识别报警单元模块基本结构

可以看出比较关键的部分是图像识别单元。这部分需要对监控范围内的对象变化进行判断,因此要满足如下要求:

(1)实时性好。能够实时对闯入监控范围的内的对象进行判断;

(2)异常报警准确性高。能够滤掉一些错误信息,如苍蝇等小飞虫:

(3)环境适应能力强。系统能在各种光照条件下工做适应日光、灯光强度变化的影响。

实现这种自动监控系统的图像识别算法通常有三种:

(1)帧间相减技术。帧间相减技术较为简单,它的原理是系统首先获得外部静态环境的原始图像,当监控启动后,在一定间隔内采集一幅图像与原始图像进行像素值比较,设定一阂值,当超过它时表明有物体进入观察区域,通过调整闭值的大小来改变报警的级别。

(2)相关性检测技术。相关性检测技术是指当给定一幅图像大小为MxN的数字图像法f (x,y),与另一幅图像相同大小的数字图像w (x, y)比较,求它们之间的相关性(;l。它们之间相关定义下式所示:

其中m=O}M-1,n=O}N-1。再对(1)式进行归一化由(2)式表示:

值越大表示两幅图像越近似,通过对几的闭值设置来判别是否报警,

0 0000

17

000

(3)当物体进入监控范围后,通过提取它的边、角、峰、谷等局部视图区域中最富有结构、纹理和运动信息来判别【’“]。通过边缘提取技术(如Sobel滤波等)来获得目标的边缘图像。然后将获得的目标轮廓抽象成圆柱几何模型,并利用数学几何方法求出每一部分圆柱的质心,表示为特征向量。

根据人体生理特征和运动特征,各特征点间存在着一定的距离比例关系和方位关系。在检测过程中将各目标的特征点间的距离比例参数和方位参数与人体相应的标准参数比较,若在一定的误差允许范围内,则表明该目标是人,系统发出预警。

由于检测算法是在嵌入式平台上运行,因此算法不能过于复杂,所以这里结合(1) (3)两种方法,提出基于边缘的背景去除算法。

4.2.2基于边缘的背景去除算法的原理与实现

基于边缘的背景去除算法首先要在监控范围内将目标从背景中提取出来,因此背景的去除在整个处理中十分重要,由于背景图像是静止的,用实时图像与背景图像相减即可滤掉背景而只保留图像变化信息,不过由于光照情况时刻都在变化,背景图像也跟着变化,因此做差所用的背景图像也必须实时进行更新。

背景更新通常采用某一时段多帧图像加权和,其主要目的是减少噪声的影响,但这样得到的背景与实时背景有一定差异当背景图像发生缓慢或者剧烈变化时,对于确定形成原因是由背景剧烈变化引起的还是有人进入引起的,还是有一定的误差。

在光线变化的情况下,图像的边缘信息是恒定的,因此可以避免普通的背景差因光线强度的变化而造成的误报警。算法流程如图4.4所示。

图4. 4基于边缘的背景去除算法的流程图

0 0000

18

000

对图像的边缘提取是采用Sobel算子来完成,Sobel算子很容易在空间上实现,而且可以产生较好的边缘检测效果,受噪声的影响也比较小。这里采用图4.5中的两个Sobel算子模板分别计算每一个像素点的梯度值。9]。在利用V4L采集图像时,调用v41_ set-palette()函数,将vd->设为VIDEO一

PALETTE_ YUV420,即采用YUV420的图像采集格式,好处是色差通道可以比亮度通道用更低的采样率。YUV420表示采样率为4:2:0,它表示2:1水平向下采样,2:1垂直向下采样。假设采640 X 480大小的图像,则其在内存映射区数据存储形式为Y ( 640 X 480 ) U(320 X 240) V(320 X240)。取Y < 640 X 480)存储成PGM格式文件,即得到一帧640 X 480的灰度图像。

图4. 5 Sobe 1算子模板

设图像中的象素是f(i,j ),根据下列公式进行计算:

然后根据一定的闭值来取舍s,大于闽值的点设为255,小于阂值的点为0,就得到了底为黑(0)边缘为白(255)的图像。

取十帧背景图像叠加作为参考的背景图像,实时边缘图像一定是包含背景边缘的,因此需要进行背景去除,而背景边缘同时存在于背景图像和实时图像中,因此设实时图像为f(x,y),背景图像为b(x,y),那么只需按如下公式处理便可得到去除背景的目标图像。

经过提取之后得到的目标图像会产生很多噪声点,影响下一步的判断,因此有必要将这些噪声点去除。噪声点是离散的,而目标边缘图像是连续的。因此,可以通过判断图像中的白点是否离散确定噪声点。对图像中的每一个像素值m为255的点,取其周围八个像素点的平均值m,满足下式:

0 0000

19

000

即如果m<=255/4,那么就认为这个点是离散的。

这样得到的结果是去除背景的人的边缘二值图像。根据得到的边缘图像信息,可以通过统计图像边缘的像素数来决定是否进行报警,通常情况下,如果边缘的像素数超过整个图像的1/100,就认为有目标出现。这样可以通过设定闭值来过滤一些不用关心的小目标,比如说小飞虫等进入监控范围内所造成的图像变化。此算法来去除实时图像中的背景是简单而高效的,非常适用于实时处理。

4. 2. 3语音采集与报警的实现

在面向多媒体的嵌入式处理器中,大多带有音频总线控制器,例如PXA255。利用处理器的这一特点,可以设计出语音采集与报警的功能。

PXA255内置I2S音频控制器,I2S是同步串行总线接口,总线上最多只能有一个主控设备,由它产生所有的时钟MCLK, LRCLK, SCLK信号。数据总是在时钟的触发下从发送端流向接收端,如图4.7所示。

图4. 7 I2S总线上的设备

I2S接口的解码芯片选择Philips公司的UDA1341TS编解码芯片。它价格低廉,支持全双工采样。采样精度支持16, 18, 20位,采样频率最高为48kHz由于声音报警对音量要求高,所以,设计硬件时就要使用功放芯片,系统设计时使用了yamaha公司的YDA 144音频功放芯片来增加音频接口的驱动能力。

系统启动时首先初始化解码器芯片,然后申请2个DMA通道用于音频传输,系统通过总线控制音频数据流的输入输出,并通过一个FIFO队列作为缓冲。播放音频数据时,系统一次设置完成DMA控制器的源数据地址、目的地址、数据长度信息,DMA控制器会自动发送源缓冲区中的数据填充FIFO,直到发送完成设定的数据长度才向系统申请中断。

在UDA1341TS驱动程序中配置I2S寄存器为标准数据帧来配合PXA255中的I2S编码器通信,即数据的第一个有效位(MSB)发生在LRCLK跳变以后的第二个SCLK时钟。

0 0000

20

000

图4. 8工2S总线上标准数据帧格式

UDA 1341 TS驱动程序采用Linux上的音频编程接口OSS ( Open Sound

System ) o在音频驱动初始化的过程中,使用register sound dsp()函数将音频设备注册为设备文件/dev/dsp o

int register soundes dsp(struct file operations *fops,int dev)

参数fops指定了设备驱动程序的操作方法,dev是设备的编号,如果是一1,则系统会自动分配一个未使用的音频设备编号。DSP设备驱动包括的方法主要有open, write,read, release, ioctl, poll。音频设备驱动设计时首先实现的是open方法,主要的任务是负责DMA缓冲区的初始化。初始化四个默认的全局变量:

audio rate-音频采样频率

audio channels—音频通道数量

audio一 fragsiz一音频缓冲区片大小

audio一 nbfrag一音频缓冲区片数量

其中,后面2个是与音频DMA缓冲区相关的,在初始化DMA时要用到。Open方法首先判断设备的打开方式(读取,写入,读/写),再根据设备的打开模式初始化PXA255 I2S总线的工作模式(发送、接收和收发),并清空所需要的DMA缓冲区。

DSP设备open以后,通过audio setupse buf()创建DMA缓冲区。其数据结构设计如下:

typedef struct{

int size;//缓冲区大小

char * start;//指向缓冲区起始处

dma addr_t dma addr;//缓冲区物理地址

struct semaphore sem;//信号量

int master;//操作buf的线程

} audioes buf t;

灯pedef struct{

audio一 buf t *buffers;//指向audio缓冲区的指针

audio一 buf t *buf;//当前用于read/write的缓冲区

0 0000

21

000

u int buf idx;//指针编号

u int fragsize;//缓冲区大小

u int nbfrags;//缓冲区总数

dmach t dma ch;//DMA通道(12为音频通道)

} audio stream_t;

函数audio setup buf根据事先设置的DMA缓冲区片和缓冲区片的大小开辟音频缓冲区所需要的空间。音频缓冲区可以被描述成下面的结构:

图4. 9音频缓冲区结构

在Linux应用程序中,通过对DSP设备文件节点的写入(write >和读取(read ) ,

可以实现声音的播放和录音。如将wave文件复制给DSP设备,就可以听到声音,wave文件是一种非压缩的音频数据格式,它有一个标准的文件头,它一记录了音频的采样格式,通道数等信息,但使相对于后面的音频数据,这个头很小,通过cp命令播放时作为开头的一点点噪声忽略了。所以,当报警被触发时,调用命令cp /dev/sound/dsp,可实现声音的回放。

4.3图像数据压缩模块软件设计

由视频采集模块获取的图像数据需要在无线网络上传输,为了提高传输效率从而提高视频图像质量,则需要将原始的视频图像进行压缩编码。

4.3.1 MPEG-4压缩理论与实现

4. 3. 2. 1视频压缩技术

视频压缩是实现数字网络视频监控的关键技术。视频压缩的目的是对数字视频进行编码,在保持视频质量的同时占用尽可能少的空间。视频编解码技术理论依据为信息理论的数学原理。由于视频图像数据有极强的相关性,即大量的冗余信息,包括空域冗余信息和时域冗余信息。压缩技术就是将数据中的冗余信息去掉,而压缩处理后的视频质量的高低是决定多媒体服务质量好坏的主要因素。

在学术和应用领域许多人都在致力于视频压缩技术的研究,并且制订了众多 0 0000

22

000

标准,如:ITU-T的H.261, H.263, ISO/IEC的MPEG系列标准。这些标准覆盖了很大的视频速率范围和应用领域,支持不同速率、不同的图像质量要求等条件的视频业务。由于本监控系统是通过无线网络进行视频传输,而无线信道又具有易错、时变和带宽有限的特点,因此选择合适的视频压缩标准对系统的开发至关重要。

4.3.2.2无线信道对视频信号的要求

无线通信技术摆脱了有线的束缚,成为追求自由通信的重要手段。数字视频信号通过无线信道有效传输成为实现未来通信的关键技术之一。视频业务的数据量大、对误比特率要求高,无线信道又具有易错、时变和带宽有限的特点,因此信道的误比特率要比有线坏境大得多,且随着基站和终端位置、方向的改变而变化很大。因而,无线视频系统在实际应用中面临着许多问题。

无线通信中视频系统应至少满足三个要求:

(1)对视频信号要有很高的压缩比。无线信道的带宽资源是一种稀有资源,而原始数字视频信号又具有海量数据的特点,因此极低比特率视频压缩编码方法是需要首先解决的问题。

(2)对信道抗误码能力高。为了克服远近效应等问题,以获得无线信道的高系统容量,需要低的信噪比,但这可能导致更高的误比特率。视频信号又对误比特率有更严格的要求。

(3)低功率消耗。由于无线视频系统往往是便携式的嵌入式系统,一般由电池供电,其供能系统的容量受到较大限制,因而减少功率消耗是能限系统正常工作的关键。

4.3.2.3 MPEG-4适用于无线传输的关键技术

本系统采用先进的MPEG-4标准对视频图像进行压缩编码,MPEG-4不同于过去的MPEG-2或H.26X系列标准,其压缩方法不再局限于某种算法,可以根据不同的应用进行系统裁剪和选择。为此,MPEG-4提供了一个包含各种工具和算法的工具箱,给出各种任意形状可视对象的高效表达式,可用于各种图像和视频的高效压缩[[z2]0

MPEG-4最重要的特点在于,它不同于传统的图像/视频编码方法,第一次提出了基于对象的视频编码的概念和方法。为此,MPEG-4引入视频对象平面(VOP)的概念面向视频对象进行编码,在这一概念中,根据人眼感兴趣的一些特性,如形状、运动、纹理等,将图像序列中每帧的场景看成是由不同VOP所组成的[[23]。而同一对象连续的VOP称为视频对象(Video Obj ect ) a

为了高效的降低图像信号的视频冗余度,MPPG-4使用了基于块的运动估计和补偿技术。它主要采用了3种图像类型:

.VOP ( Intra VOP),它是不采用参考图像的编码而产生的图像。

.P-VOP(Predicted VOP),它采用上一个I-VOP或上一个P-VOP来进行运动补偿预测。

.B-VOP(Bidirectionally-Predicted VOP),它同时采用前面和后面的I-VOP或 0 0000

23

000

P-VOP作基准,进行运动补偿预测编码。

为了提高传输效率,MPEG-4采用了“子图形”预测和编码技术,它把静止的背景作为“子图形”首先发往接收端,作为第一帧同时存储于编解码器内[[24]。再将背景前出现的视频对象分开进行编码,形成视频序列进行传送,进而实现重建原始的图像。

从前面的讨论可以看出传统的视频编码方法不太适合无线传输其根本原因是因为无线信道带宽的可变性及不稳定性。而MPEG-4标准是目前比较成熟的适于无线信道传输的压缩标准,首先,Mpeg-4有很高的压缩比,对传输速率要求较低,在4.8 ^' 64Kbps之间。其次,它采用的分层可扩展性编码技术和码率控制技术来自动适应无线信道带宽较窄且不停变化的特性,并针对无线信道容易出现的随机错误,为提高信道容错能力,定义了一系列错误恢复工具。

(1)分层编码将整个视频流分为可逐级嵌入的若干层,不同复杂度的解码器可根据自身能力,从同一数据流中抽出不同层进行解码,得到不同质量、不同分辨率的视频信号。使同一个数据流适应不同特性的解码器,提高灵活性和有效性。对于传输信道来说,分层编码可应用于不同的网络带宽和网络状况,在速率起伏很大的IP ( Internet Protocol )网络及具有不同传输特性的异构网络上有重要的义。

图4. 14 MPEG-4分层描述语法结构

(2)码率控制是编码器基于对网络可用带宽的估计决定要发送到信道上的视频比特流数率}ZS}。码率控制在视频编码器中起着非常重要的作用,一方面它调整编码比特流满足某种给定的带宽条件;另一方面,改善视频编码的质量。码率控制策略的好坏是直接影响活动图像编码器的输出码率稳定性和图像质量的重要因素。

( 3 ) MPEG-4具有修正传输过程中产生错误的特性,即容错性。抗误码工具包括再同步,数据恢复和误差隐藏,且这些工具在MPEG-4均得到了进一步优化。

由于其良好的容错机制,使得视频流在信道传输后,解码的质量得到保证。这对于多媒体信息在信道下的传输有着重要的意义。由于信息经信道传输后不可避免的会出现错误,且被压缩后的信息对错误特别敏感,如果不加以处理, 0 0000

24

000

在接收端,多媒体的质量将严重下降而不可用。尤其对十无线电传播,由于电磁波传播是扩散的,地理环境复杂多变,且用户位置处于移动中,不可预测,其信息传输更为不稳定。可以说,MPEG-4的出现,促进了含有视频流内容的移动式产品的发展。

4. 3. 2. 4 Xv i D编码器

在几种开放源代码的MPEG-4编码软件中,选择xvidcore作为本系统中视频图像压缩模块中的核心算法。

2000年以前,Microsoft开发的用于Windows Media的编码解码平台,是当时唯一的MPEG-4编码器,包括MS MPEG-4 VI, MS MPEG-4 V2, MS MPEG-4 V3的系列编码内核。2000年2月,黑客破解了MS MPEG-4 V3,并以此开发了一个新视频编码解码平台,这就是大名鼎鼎的DivX。它利用开源世界的技术力量迅速发展起来,却在最后封闭了源代码。这个结果不为开源开发小组的人所接受,他们在DivX的基础上开发出了XviD a XviD经过一年的发展,性能得到极大的提高,被认为目前世界上速度最快的MPEG-4 Codec a

对于一个第二代的MPEG-4视频编码内核来说,XviD的各种算法设计都有代表性的先进意义。其特点主要有:

(1)多种编码模式。除了最原始单重估定码流压缩(I-pass CBR)之外,XviD提供了包括:单重质量模式动态码流压缩、单重量化(Quantization)模式动态码流压缩、和包括外部控制和内部控制的两种双重(2-pass)动态码流压缩模式。

(2)量化(Quantization)方式和范围控制。量化就是在编码时通过对时间或空间上相邻的画面单元进行同化、模糊细节的程度,是对画面质量最基本的控制因素。XviD不仅提供了标准的MPEG量化方式,还特地提供了更适合低码流压缩的h.263量化方式。

(3)运动侦测C Motion Seach )和曲线平衡分配(Curve )。对画面逐帧进行运动侦测,以及对全片段的运动侦测结果进行分析后,重新以曲线平衡分配每一帧的量化幅度,以实现需要高码流的运动画面可以分配更多空间、更高的码流、更低的量化幅度来保持画面的细节;而对于不包含太多运动信息的静态画面,则消减分配预算。

(4)动态关键帧距。由于在视频压缩中不是每一帧都记录着全部的画面信息,事实上只有关键帧一记录着完整的画面信息,而后续的P帧((P-Frame)仅仅是纪录下与之前一帧的差值。如果关键帧之间的画面变化很大,则会浪费宝贵的空间在P-Frame上,而加入把变化很大的那一帧记录在关键帧里,那么由于后续的帧不再有更大的变化,就可以节省P帧所需的空间。因此,根据画面镜头切换和运动幅度来变换关键帧的位置,有利于画面质量的提高。

系统中Xvid的程序设计主要分为开始,结束和压缩循环三个部分,分别对应mpeg4_ start()、mpeg4_ stop()、mpeg4 loop()三个函数。

mpeg4_ start()主要完成XviD的编码器的初始化工作。以下是初始化XviD的核心代码:

0 0000

25

000

mpeg4_ start() {

xvid_gbl_ init t init}aram; /lXviD初始化参数

xvid enc create t xvid enc create; //XviD编码参数

xvides enc_plugin t plugins[1];//插件队列

xvid_plugin single t single;//运算参数

xvid_encee frame t xvid ences frame;//帧设置

xvid_enc_ stats_t xvid enc- stats;//编码状态设置

xvid_global (NULL,XVID_ GBL_INIT,&xvid_gbl_ init,NULL);//初始化

//编码参数中有一些比较重要的设置,可以根据环境、功能需要变化。

xvid_enc_ = XVIDee CSP一 BGR;//视频输入格式

xvides enc =width;//编码器输入宽度

xvidee enc =height;//编码器输入高度

xvid_enc- e=XVID_PROFILEee AS L4;//编码的框架级别

xvid enc一 _key interval=10;

xvidee enc 一rop ratio=0;

plugins[0].func=xvid_plugin single;

plugins[0].param=&single;

xvid encee _flags=XVID一OPwe HALFPEL;

e=bitrate* 1000;//bitrate为mpeg-4压缩后的码率

xvid_enc一 =0;

xvid encore(NULL,XVID一NC_ CREATE, &xvid enc_ create, NULL);

//编码器参数设置完毕以后,创建一个编码器实例

}

创建实例后,编码器并不马上开始编码。真正的编码工作在创建编码器实例成功后调用xvid_ encore(xvidee handle, XVID_ENC_ENCODE, &xvid_enc_

frame,&xvid_enc_ stats)进行,编码过程mpeg4_ loop()可以由以下伪代码表示:

while(编码标志)

读取采集设备映射内存;

if(读网络反馈控制信息变化)

修改本帧图象编码参数xvides enc一ame&xvid enc一 stats;

length=xvid_ encore(xvid_ handle,XVID一 ENC_ ENCODE,&xvid enc_

frame,&xvid_ enc_ stats);

memcpy(buffer, mp4_ buffer, length);

//编码后的码流存放在mp4_ buffer缓存中,长度由length指示。

刀编码结构存放在发送缓冲区内,也可以放入文件中。

fwrite(buffer,length, I,fp);

}

最后,mpeg4_ stop()调用xvid_encore(xvidwe handle, XVID一 ENC_

0 0000

26

000

DESTROY,

NULL, NULL)结束编码。

在编码过程中,一般是让编码器自行判断什么时候产生I帧,但为了提高容错性或者减小网络传输量,会增大或减小I帧的产生频率。I帧的控制由参数

xvid_ enc_ 一ey interval来决定,当它设置成一1时,XviD系统自动选择当前编码是否为I帧或P帧。当网络状况比较良好时(丢包数较少),可以适当减少I帧数量,这样可以提高服务质量。当网络丢包率上升时,就要考虑增加I帧数量,这样可以更快更好地修正、掩盖错误。

4.4本章小结

本章首先介绍了嵌入式Linux下利用USB摄像头实现视频采集的方法,然后介绍了图像识别报警子系统的设计与实现,提出了基于边缘的背景去除的图像识别算法并给出了报警邮件发送的原理与实现,音频采集驱动的设计与实现,给出了图像JPEG和MPEG-4的视频压缩的设计步骤,并通过Linux下多线程程序的设计方法完成多个模块设计。

第五章网络视频传输模块软件设计

数据在网络上传输需要遵守一定的网络协议,数据的类型决定了网络协议的选取。针对网络上传输视频等实时数据的需要,电信业和计算机业许多国际组织进行许多标准化的工作,现在较为关键的协议有RTP/RTCP, RTSP等。

5.1流媒体传输控制协议栈

在TCP/IP参考模型中,传输层通信协议TCP和UDP都不能满足流媒体传输的QoS要求。TCP协议采用滑动窗口控制机制,数据传输随着流控窗口动态的启动和关闭,加上TCP重传造成的时延,使其难以满足流媒体实时的传送要求。UDP协议的无连接特点能够提高传输速率,虽然可以在某种程度上满足流媒体的实时性要求,但是由于其没有提供拥塞控制和质量保证机制,也无法满足流媒体传输的需要。

为了实现流媒体在IP上的实时传送播放,需要在传输层协议((TCP/UDP)和应用层之间增加一个通信控制层。在增加的通信控制层,采用相应的实时传输协议,主要有:数据流部分的实时传输协议RTP(Real-time Transport Protocol),用于控制部分的实时传输控制协议RTCP(Real-time Transport Control Protocol),实时流协议RTSP(Real-timeStreaming Protocol)。下图是整个监控系统所涉及到的协议以及相互关系。

0 0000

27

000

图5. 1流媒体传输控制协议栈

(1)RTP/RTCP协议簇

实时传输协议RTP(Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输协议。RTP本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。通常RTP算法并不作为一个独立的网络层来实现,而是作为应用程序代码的一部分。实时传输控制协议RTCP(Real-timeTransport Control Protocol)和RTP一起提供流量控制和拥塞控制服务。在RTP会话期间,各参与者周期性地传送RTCP包[f2}10

(2)实时流协议RTSP

实时流协议RTSP(Real-time Streaming Protocol)是应用级协议,用于控制具有实时特性的数据传输,它提供一个可扩展的框架,以使诸如音频和视频之类的实时媒体的点播传输成为可能[28]。RTSP在体系结构上位于RTP和RTCP之上,它使用TC',P或RTP完成数据传输。

图5. 2流媒体传输功能框图

监控系统是在传输层协议((TCP,UDP)上解释RTP, RTCP, RTSP协议的,所有的客户连接请求都是以TCP的端口获得的,流媒体数据也都是打成RTP包,通过UDP端口发出去的。当监控系统面对一个单一的客户,完成的过程如下:

(1)在客户端发出RTSP连接请求后,服务器通过对TCP端口的监听,读入 0 0000

28

000

请求。

(2)解析请求内容,调入相应的流媒体文件。

(3)形成RTP包,分发数据流包,获得RTCP包。

(4)数据包发送完毕,关闭连接。

5.2 RTP/RTCP协议分析与实现

5. 2. 1 R丁P协议分析

一个RTP数据包包括一个12个字节的固定RTP数据头,参与源表示符和扩展头是可选的。格式如图5.3所示:

图5. 3 RTP包格式

版本((v, 2bit):这个域标识RTP的版本。RFC3550定义的版本是20

填充位((p, lbit):表明有一个或多个不是载荷数据的填充字节在包尾,最后一个填充字节包含了填充字节的个数。

扩展位((x, 1 bit):在固定头后面接着一个扩展头。扩展机制能够应用于传递控制信息,而不需要中间节点的解释。RTP扩展报头是两个字节,包含一个右对齐的16比特长度的域,指示扩展的长度。它必须在标准RTP报头(后面会看到,要么是SSRC项,要么是CSRS项)的最后一个有效域之后插入。

CSRC源记数(CC, 4bit): CSRC是在固定报头后CSRC标识符的数目。这个数值用于来支持混合器的“混合”功能。混合器从多个信源收集多媒体流,把它们合并成为一个包,然后转发到目的地。

标记位(M, 1 bit):标一记的解释是由配置来定义的。它可以用来在包流中标记重要事件,比如帧边界。配置可以定义另外的标记位,或者通过改变有效载荷类型域中的比特数来代替使用标记位。M比特位意味着谈话的突然开始或者图像帧的结束。

有效载荷类型((PT, 7bit):这个域标志RTP有效载荷类型的格式,并且决定应用程序对它的解释。

序列编号(sequence number, 16bit):序列编号起始为一个随机数,每发送一个RTP包,序列编号加一。它可被接收者用于检测包丢失和恢复包顺序。

时间戳(timestamp, 32bit):时间戳是在RTP数据包的第一个字节采样时刻。采 0 0000

29

000

样时刻必须随时间单调线形增加,以允许同步和抖动计算。时钟分辨率必须满足要求的同步精确度,以及对包到达抖动的测量,并且可以分接成端到端延迟的分辨率。时钟频率与作为载荷携带的数据格式无关。对于周期性发送RTP包而言,采样时刻是由采样时钟确定的。如果一个应用每读入一个数据块要占据n个采样周期,则无论数据块被发送或丢弃,每个时间戳标记都增加no

同步源SSRC(32bit): SSRC标志同步信源,数值是随机选取的,且在同一个RTP会话中没有两个发送者的SSRC标识相同。

参与源CSRC列表((0} 15项,每项32bit): CSRC列表标识提供这个包中包含的所有有效载荷的信源。标识符的数量是由CC域确定的。CSRC标识符仅在通过混合器时插入。当端点发出有效载荷时,CSRC域用来对信源标识进行更正。

5. 2. 2 RTCP协议分析

在RFC3550中说明的和RTP相配的控制协议是RTCPoRTCP包把关于会话质量的端到端信息传送给每个参与者。像包延迟、抖动、收到和包丢失等数值对网络而言非常有价值,可以用来实时估计网络自身的状态。有5种类型的RTCP包:

SR: Sender Report,发送者报告

RR: Receiver Report,接收者报告

SDES : Source DEScription,信源说明

BYE: Hang up from a session,挂断会话

APP: Application-Specific acket,特定应用的包

系统中,并不是5种RTCP报文都必须实现,其中SDES报文主要功能是作为媒体会话成员标识信息的载体,此报文的功能在本视频传输方案中是多余的,另外,APP报文目的是测试新开发的应用和特征,这里也不实现。本系统实现三个报文:发送者报文SR、接收者报文RR和结束会话BYE报文。

RTCP报文由公共报头部分和结构化的内容组成,报文内容根据报文类型的不同而具有不同的长度,一般以犯位为边界。这里先对SR报文加以说明。SR报文一般由三部分组成:RTCP公共报头、发送者信息和接收者报告块。图5.4所示的为系统所采用的简化包格式,未采用RTCP标准包中的P, SC等域,也未采用标准SR报文格式中的第三部分接收者信息部分。

0 0000

30

000

图5.4 sR报文格式

(1) RTCP公共报头部分

.V:版本号,2bit,当前版本为2;

.P:填充标志,lbit,如果填充标志为1,则在单一报文中尾部填充八位组;

.RC:接收报告计数,Sbit,指出接收报告的块的个数;

.PT:报文类型,8bit,SR类型为200;

.报文长度:16bit,RTCP报文长度减1,包括报头和填充,以32位为单位;

.SSRC标识符:32bit,发送该SR报文的同步信源标识符。

(2)发送者信息部分

.NTP时戳:64bit,指出该SR报文发送时的全局网络时间;

.RTP时戳:32bit,和NTP时戮一致的时间,但必须和RTP报文中的时戳保持相同的时间单位;

.发送者报文计数:32bit,发送者从开始传送RTP报文到该SR报文产生的时间间隔内共发送的RTP报文总数;

.发送者有效载荷字节计数:32bit,发送者从开始传送RTP报文到该SR报文产生的时间间隔内共发送的有效载荷总数,字节为单位。

RR报文和SR报文格式基本相同,只是RR报文不包括SR报文格式中的第二部分,即发送者信息部分,报文类型PT=201 o BYE报文格式更简单,它是RTCP公共报头部分,即SR中的第一部分,加上一个32位数据,在程序中填充的是IP地址,通知对方此IP要退出会话,BYE报文的类型值PT =203。

5. 2.3 RTP/RTCP协议的软件设计与实现

根据前面介绍的RTP/RTCP协议的报头结构,这里给出它的程序实现。RTP协议的代码可以分为四类:与协议相关的数据结构、处理传入和发送RTP数据分组的代码、处理接收和传输RTCP报文的代码以及常用工具函数。具体的代码及其说明如下:

首先给出RTP报头结构和接收发送端的数据结构。

struct RTP一ead刊RTP报头结构;

0 0000

31

000

unsigned int rtpwe ver;//协议版本字段,2bit;

unsigned int rtp}ad;//填充标志,lbit;

unsigned int rtp_ ext;//扩展标志lbit;

unsigned int rtp_cc;//CSRC计数器,Obit;

unsigned int rtp_mark;//标记,lbit;

unsigned int rtp payload;//有效载荷类型,7bit;

unsigned short rtp_ seq;//序列号,16bit;

unsigned int rtpes timestamp;//时间戳,32bit;

unsigned int rtp_ssrc;//同步信源标识符,32bit;

unsigned int rtp_csrc;//特约信源标识符,32bit;

};

struct RTPes RECV {//接收端数据包数据结构;

unsigned int rtpes rec len;//数据包总长度,按字节计数;

unsigned int rtpee rec seq;//扩展序列号,防止序列号溢出;

struct RTPee RECV *next;//指向下一个序列号低于本数据包序列号的报文;

struct RTP_RECV *prev;//指向下一个序列号高于本数据包序列号的报文;

struct RTP一 HEAD rtpes rec;//RTP数据包;

};

struct RTP_SEND{

//发送方的数据包数据结构和接收端数据结构必须具有相同的结构类型,即其内的变量

类型和顺序要一致

unsigned int rtp_sendto len;

unsigned int send seq;

struct RTP_ SEND *next;

struct RTP_ SEND *prev;

struct RTPes HEAD rtpes send;

};

下面给出RTCP公共报文格式数据结构、SR数据结构和RR数据结构。在SR和RR数据结构中不再定义公共字段,而是把它们和定义的RTCP公共数据结构.联合使用,组成完整的符合协议要求的RTCP报文。对于BYE报文,则不单独实现它的数据结构,而是用一个RTCP公共报文加上一个要求结束会话端的IP地址的方式,在专门的函数中实现。

/*RTCP协议公共报头*/

struct RTCP Head{

unsigned int RTCPwe Ver;

0 0000

32

000

unsigned int RTCP_Pad;

unsigned int RTCP_Count;

unsigned char RTCP Type;

unsigned short RTCP一 Length;

unsigned int RTCP_SSRC;

};

/*发送者报文SR*/

struct RTCP SR Head{

long double RTCP一TP;

unsigned int RTCPes RTP_ Stamp;

unsigned int RTCP_ Sendes Pack Count;

unsigned int RTCP_ Sendes Data一 Count;

unsigned int RTCP SSRC l;

unsigned int RTCP工ostes Rate;

unsigned int RTCP_ Lost Total;

unsigned int RTCP~ Max_ Seq;

unsigned int RTCP_ Timees Delay;

unsigned int RTCP LSR;

unsigned int RTCP DLSR;

unsigned int RTCP_ SSRC_2;

};

数据结构设计完后,就可以根据协议编写相关函数了,核心函数有:

(1)void RTP Init (unsigned int,int); RTPes Init C)先把保存会话信息的数据结构清零,接着便创建一个分组缓冲池以及线程所使用的必要的条件变量和互斥量,并启动两个线程,一个用于处理传入的RTP分组,另一个用于处理传入的RTCP分组。

(2)void RTP Packet HEAD(struct RTP_HEAD*);该函数初始化一个RTP包,填充包信息。

(3)void RTP一acket MPEG4(struct RTP_ HEAD *,char*);该函数利用RTP报头封装MPEG-4视频数据。

(4)void RTP一 UnPacket_ HEAD(struct RTP一 HEAD *,char*);该函数将收到RTP数据包后去掉报头,将视频数据送入缓冲器。

(5)void RTP Recv(void); RTP_Recv()启用一个单独的线程来接收和处理RTP分组,函数中有一个无限循环,每次循环从套接字里取出一个分组,验证首部后,将分组排列到队列等待解包,同时在会话开始启动发送RTCP报文线程。

(6)void RTP-Send(void); RTP_Send()创建一个独立线程在会话开始时发送封装后的视频数据。

(7)int RTPes Update(struct RTP_HEAD*);RTPee Update()为RTCP保存统计信 0 0000

33

000

息。RTCP要周期性的产生接收方报告,需要最新分组的报头信息,每次有RTP分组到达,都要调用此函数,该函数更新RTCP接收方报告所需要的信息。

(8)void RTP_ Init Seq(unsigneds short); RTP_ Init Seq()初始化分组序列。每次流开始时,RTP强制执行一个检查期,在此期间,必须按序到达的分组有个最小限度,如果有分组失序,调用此函数,计数器清零,检查期重新开始;

图5. 5 RTP协议软件流程图

(1)void RTCP Create一 Head(void);用于创建RTCP公共首部。

(2)void RTCP_ Createes RR(void); RTCP_ Createes RR产生RR报文。函数提供主循环,当有传入会话建立时便开始循环,每次循环,测试流是否还处于活动状态,如果上次循环以来有数据流传入,便发送RR报文;如果上次循环以来没有数据到达,则开启计数器,记录没有数据到达的循环数目,低于门限值就什么也不做,高于门限值就调用RTCP_Create- Bye函数产生发送一个BYE报文,退出视频通信。

(3)void RTCP Create SR(void);用于创建发送方报文。SR报文的创建需要先取得本次会话的SSRC,并将已发送的报文和字节数填入SR报文中。

(4)void RTCP_ Sent RR(void);用于发送RR报文。

(5)void RTCP_ Sent SR(void); RTCP_Sent SR()用于发送SR报文。

(6)void RTCP_ Createee Bye(void); RTCP Create Bye()创建BYE报文。当要离开RTP会话时,参与者必须发送一个RTCP的BYE报文。

(7)double RTCP_Pack Lost Rate(void); RTCPes Pack Lost Rate()计算RTP报文 0 0000

34

000

丢失率,报文丢失率=报文丢失累计/接收到的最高序列号。

图5. 6 SR报文发送流程

5.3基于RTP/RTCP的MPEG一4传输技术

利RTP协议传输视频,首先要把视频流进行封装,但封装不仅仅是在数据前面加上RTP报头,RTP报头承载多大的数据,这些数据应该如何组织等问题也必须考虑,因为它们对视频的质量有着重要影响[}29} o MPEG-4是面向对象的压缩方法,而以前的视频压缩标准,如MPEG-1 /2, H.261 /263等都是基于帧的,因此一个视频数据包封装成一个RTP数据包的方法不适应了。根据MPEG-4的系统层次模型和RFC3016,下面给出对MPEG-4的视频对象平面((VOP)的封装算法。

5. 3. 1 RTP有效载荷的确定

视频数据封装的首要问题是如何确定分组的长度,使得通信的额外开销小,并且保证单个数据包的丢失对整个视频通信产生的影响较小。

图5. 7 MPEG-4系统层次

图5.7是MPEG-4系统的简略层次图。编码器在压缩层对视频数据进行编码 0 0000

35

000

产生基本流((ES),基本流中包含了编码后的视频对象平面((V OP)信息,然后压缩的视频流进入同步层(SL) o SL对VOP封装,加入定时、同步等信息,形成SL流,SL流进入传输层经过F 1 exMux工具复用后交给RTP协议形成RTP包交付网络传输。经过这个过程,数据得到一个50字节的报头,即每一个数据包都要有50个字节的额外开销,它们分别是同步层(SL)3个字节,灵活复用层(F 1

exMux)3个字节,RTP报头16个字节,UDP报头8个字节,IP头20个字节。

数据包报头大小固定的情况下,每个RTP报文封装的数据越多,就越可以减少数据包报头带来的额外开销[}30}。但是,大分组可能会超过传输网络的最大传输单元MTU

C Maximum Transmission Unit,这将导致传输过程中对IP数据包的分段,从而增加数据分段的处理时间开销和协议开销,更严重的是,任何一个IP分段的丢失都会导致整个IP包失效,造成大量数据丢失,使视频数据通信受到很大影响。因此,网络最大传输单元(MTU)是RTP数据报的上限,即封装的视频数据不能超过(MTU-50)个字节的大小。常见的网络最大传输单元如表5.1所示。

表5. 1几种常见网络的最大传输单元(MTU )

数据报传输过程中可能经过多个不同结构的网络,而各种网络的·MTU极可能有不同的值,其中的最小值称为路径MTU}31}。路径MTU是系统中RTP数据包的最大值,尽管相关的RFC文档描述了路径MTU发现机制,也可以通过程序设计获得网络的MTU,但并非所有的路由器都支持MTU的发现机制,而且系统的数据传输主要是针对GPRS网络所设计的,故在程序设计时对RTP报文有效载荷采用固定的值,即MTU(800Bytes)减去报头长度(SOBytes),即最大有效载荷为750Bytes。

5. 3. 2 VOP的封装算法

确定了RTP的最大有效载荷之后,正式讨论MPEG-4视频数据的封装策略。MPEG-4压缩编码是针对VOP的,因此研究的重点就是在没有超过最大有效载荷的情况下用RTP协议如何封装VOP o

0 0000

36

000

如果两个VOP的数据量较小,其总和小于RTP可以承载的最大数据量750Bytes,那么从传输的效率考虑,应该把两个VOP用一个RT P包发送,但一旦这个数据包丢失,将意味着两个VOP的损失,这对视频质量的影响很大,因此在效率和效果之间进行折衷,就是说每个SL只封装一个VOP,一个RTP只承载一个SL。当VOP超过750Bytes,即当VOP太大从而会导致RTP包大于MTU时,将VOP进行分片,在RTP包不大于MTU的情况下在SL层尽量多的封装宏块(MB),因为宏块大小总是小于允许的封装最大值,每个RTP包至少携带一个宏块,同时把VOP的头信息拷贝到每一个SL包中减小包间依赖性,这样当个别数据包丢失时,接收端还可根据到达的数据恢复出大部分的

封装策略可以总结如下:如果一个VOP大小适合用一个包,则将此VOP用单一的数据包封装;否则,让一个数据包尽可能的多携带视频数据宏块,同时拷贝VOP报头进入此数据报,不允许不同VOP的数据出现交叉,即在一个数据报中不能有分属于不同VOP的宏块。这种算法虽然简单,但增强了健壮性,低码率下效果明显。当然也存在一定问题,如:有可能出现过小的分组以及重复的VOP头拷贝。

下面给出实现该算法的伪码。先定义变量BitCount为当前封装过程中读取的视频数据的位((bit)数,MaxPL(Maximum Payload Length,最大负载长度)为750BytesVOP-start-code是MPEG-4标准中定义的一个数据,表示一个VOP的开始,同时作为相邻VOP的分界线。算法描述如下:

while(存在需要封装的视频数据){

寻找下一个VOP start code,BitCount开始计数,记录视频流数据位数;

if((发现下一个VOP_start code)&&(BitCount-VOP_start code)<=MaxPL)

{

封装下一个VOP start code前的数据;

}

else if ((BitCount-VOP_ start-code)>MaxPL)

{

尽可能的封装视频数据宏块,但不能包括下一个VOP的数据

}

else

封装剩余的VOP数据

5.4 RTSP服务器建立

5. 4. 1 R丁SP协议概述

RTSP是一个多媒体流化表示控制协议,用于控制具有实时特性数据的发送。它提供了对媒体流的类似于VCR(Video Casette Recorder)的控制功能。也就是说, 0 0000

37

000

RTSP对多媒体服务器实施网络远程控制州etword Remote Control) o

RTSP协议负责在服务器和客户机之间创建并控制连续媒体流,其目标是像HTTP协议为用户提供文字和图形服务那样为用户提供连续媒体服务[[32]。在RTSP中,每个表示((presentation)及与之对应的媒体流都由一个RTSP URL标识。整个表示及媒体特性都在一个表示描述文件((presentation description file)中定义,该文件可能包括媒体编码方式、语言、RTSP URL、目标地址、端口及其它参数。用户在向服务器请求某个连续媒体服务之前,必须首先从服务器获得该媒体流的表示描述文件以得到必需的参数。

5. 4. 2 RTSP的消息

RTSP中的所有的操作都是通过服务器和客户方的消息应答来完成的,其消息分为请求和应答两类。

请求消息的格式如下所示:

RTSP message=Method Request-URL RTSP-Version CRLF

CRLF CRLF

CRLF

Method是请求命令,Request-URL是请求的媒体资源地址,RTSP-Version是RTSP协议版本号,表示消息头,表示消息内容。RTSPmethod包括:DESCRIBE, SETUP, OPTIONS } PLAY, PAUSE,

TEARDOWN等。

RTSP应答消息的格式如下所示:

RTSP message=RTSP-Version Status-Code Reason-Phrase CRLF

CRLF CRLF

CRLF

其中,Status-Code是3位状态码,用于在回应请求时表示主机状态,200表示成功。Reason-Phrase是与状态码对应的文本解释。

5. 4. 3 SDP会话描述协议

RTSP消息体是由SDP协议描述的。SDP( Session Description Protocol)会话描述协议为会话通知、会话邀请以及其它形式的多媒体会话初始化提供了多媒体会话描述。

SDP一般包含一下这些内容:会话的名称和目的;会话开始和结束的时间;会话的媒体组成;接收这些媒体所需的信息(接收媒体的地址、端口和媒体的格式;参加会话所需要的带宽限制;会话负责人的联系方式等)。

SDP由一系列的的文本组成。由一个字符构成并且是大小写敏感的。是由多个域组成,每个域之间用空格或其它符合分割。 0 0000

38

000

SDP是由一个会话描述层和几个可选的媒体层所组成,会话层的范围从一个“v=”的文本行开始,直到遇到第一个媒体层结束。媒体层的范围是从一个“m=”的文本开始,直到下一个媒体层或整个会话结束。

本系统实现的单播MPEG4视频流的SDP描述如下。

v=0 //sdp信息

0=一1 1 IN IP4 127.0.0.1

s=Test

a=type:broadcast

a=control:rtsp://192.168.0.66:9090/mycam/

t=0 0

c=IN IP4 0.0.0.0

m=video 0 RTP/AVP 96 //m表示媒体描述,下面是对会话中视频通道的媒体描述

a=rtpmap:96 MP4V ES/90000

a=fmtp:98 profile-level-id=145;config=00000

1BOO1000001B50001200

08440FA282C2090A21F

a=control arack0//trackID = 0表示视频流用的是通道。

5. 4. 4 RTSP的方法

RTSP的方法表示资源上执行的方法,协议定义方法有DESCRIBE,

ANNOUNCE,OPTIONS、PAUSE, PLAY, GET PARAMETER、RECORD, SETUP,

REDIRECT,SET PARAMETER. TEARDOWN[34]。本系统只实现了协议要求必须实现的几个,其命令发送和应答过程如图5.6所示。

(1) OPTIONS请求可以在任何时间发送,客户端通过发送这个请求得到服务器端支持的请求列表。OPTIONS请求不用带额外的参数。

(2) DESCRIBE请求得到通过某一个URL指定的媒体的描述信息。DESCRIBE的回应必须包括所有媒体的初始化信息,比如请求的媒体包括的流个数、每个流的类型和格式等等。

(3) SETUP请求通过某一个URL和流序号来为要播放的媒体流发出建立请求,服务器会进行一些初始化工作,成功之后会返回会话RTSP的会话ID和数据传送通道信息(比如客户端端口号、服务器端口号等)。

(4)PLAY请求向服务器提出播放请求,PLAY必须在接收到SETUP成功回应之后才能发送。PLAY请求需要指定播放媒体的起始时间。

(5) TEARDOWN请求终止当前媒体的传送,服务器端释放媒体资源。TEARDO WN也不用带额外的参数。

0 0000

39

000

图5. 8 RTSP连接及命令发送过程

5.4.5监控系统中R下SP服务器的设计与实现

RTSP服务器设计时,首先需要完成的是RTSP消息的接收器和发送器,用来负责接受请求报文和发送响应消息。本系统用三个函数来实现这个功能:RTSPse Msg Mutual()负责消息的接受和发送;RTSP一onnection()负责监听RTSP服务端口和所有己接受请求的连接;RTSP Handle()根据不同的请求调用各类方法函数处理各个连接。当服务器接收到RTSP消息时就在消息队列中加入一个新的消息,而发送消息时,经RTSP方法类函数处理后由RTSPes Msges Mutual()发送RTSP消息出去。

RTSP_ Msg Mutual, RTSP_Connection, RTSP Handle三部分的组成与联系如图所示:

图5. 9 RTSP消息接收、发送与处理

使用RTSP消息接收和发送器时,调用RTSP一sgwe Mutual即可启动RTSP 0 0000

40

000

服务监听线程和接收发送消息线程。在RTSP conection接收到新的RTSP请求时,它就会调用RTSP少andle处理此请求;之后RTSP少andle利用RTSP conection来接收RTSP消息数据,再通过RTSP消息解释器来接收RTSP消息;在检测到整个RTSP消息接收完整后,RTSPes handle把己接收消息加入消息接收队列,从而完成整个消息的接收过程。

RTSPes Msg Mutual函数通过维护消息队列的添加和删除来实现,对连接请求的监听是通过建立socket套接字来实现的,这与前面发送报警邮件的机制相同,利用Linux系统提供的网络接口函数完成RTSP服务器的监听任务。

RTSP消息解释器的作用是解析RTSP消息。在发送数据报时,发送方有可能根据各种情况来进行不同大小的数据包的封装和发送。因此,在各种不同的应用环境下,RTSP消息接收方有可能接收到不同大小的RTSP消息;此RTSP消息可能是一个完整的RTSP消息,也有可能是己被分割为几部分的一个RTSP消息的其中一部分。因此,RTSP接收方接收到RTSP消息时,要能辨识此RTSP消息是否一个完整的RTSP消息,如果不是的话必须等待接收完一个完整的RTSP消息后才能进行下一步的消息处理工作。程序中实现解释器的函数是RTSP

Handlees Request():

RTSPes Handlees Request(struct rtsp_connection *c)

if( c->re}buf[0]二=0 ) return -1;//如果缓冲区无消息则返回

printf( "Request:n%sn", c->req_buf );

刀对请求消息进行分析

for( t=c->req_buf; *t!=’r,&&*t!='n'; ++t)

if( *t一0 ) return一1;

*(t++)=0;

if( *t =_ '}') * (t++)二0;//以换行符和空行来识别消息的边界

for( i=0; i<15; ++i)

{

c->recLhdr[i] .name二t; //读取消息头域

for(;*t!=’:,;++t)

if( *t == 0日*t二='}r' p *t二='n' ) return -1;//消息头域为空则返回

*(t++)=0;

for( ; *t一”;++t )//跳过冒号后的空格

if( *t==0)return一1;

c->re}hdr[i].value = t; //读取消息值域

for( ; *t!二’r' && *t!二’n'; ++t )//读入请求内容

if( *t二二0 ) return一l;

*(t++)=0;

if( *t=='n')*(t++)=0;

if( *t==o }} *t=='r'{}*t=='n')break; //分析是否结束

0 0000

41

000

}

if(i = =15 ) return -1; //} }法的消息

c->re}hdr[i+1 ].name=NULL;

}

此外,程序设计了一个rtsp_connection结构体,用于处理RTSP的请求任务,即RTSP服务建立后,每个socket连接与一个rtsp_connection结构配对,rtsp_connection结构如下:

/*一个RTSP连接请求*/

struct rtsp_connection{

struct cone *next;

struct corm *prev;

int fd;//监听套接字

struct sockaddr in addr;//服务请求地址

char re}bu红4096];//RTSP请求消息缓冲区

int req-len;//请求消息长度

struct f char *name; char *value;}re}hdr[16];//请求消息的头域和值域

unsigned char send少ufj65536];//发送缓存

struct session *attahed session; //绑定的会话

};

程序中实现的RTSP方法函数有rtsp_OPTIONS(),rtsp

SETUP(),rtsp_DESCRIBE(),

rtsp_PLAY(), rtsp TEARDOWN()。

(1) rtsp OPTIONS(struct rtsp- connection *c)函数。请求选择函数,每一个RTSP

请求都包含了给定的序号,所以与之相应的应答也拥有同样的序号。客户端可通过该函数返回请求列表,当尝试一个非标准的请求时也不会影响服务器状态。

(2) rtsp一ESCRIBE( struct rtsp_connection *c)函数使连接者从服务器上取回用URL表示的会话描述信息((SDP)。服务器给出所请求资源的描述作为应答。

(3) rtsp_SETUP( struct rtsp_connection *c)函数提醒服务器建立会话,并确定传输模式,如TCP或UDP传输,并为流传送分配资源,如目的地址、单个流的目的端口,服务器不允许这种改变时,服务器将应答一个错误信息“455非法方法”。

(4) rtsp_PLAY( struct rtsp connection *c)函数处理连接者的播放请求。监控服务器开始发送RTP数据包。

(5) rtsp TEARDOWN( struct rtsp connection *c)函数实现客户端发起关闭视频流的请求。

流媒体监控服务器初始化过程如下:先读取RTSP服务器的配置参数,然后开 0 0000

42

000

启TCP连接线程监听RTSP服务端口(9090),创建RTSP状态机;配置参数以文件的形式存在,其中包括服务器名称RtspName、视频源的网络路径RtspVidc}opath、允许请求的最大会话数量RtspMaxsessions, RTP回放端口的最大值RtpPortrangemax和最小值RtpPortrangemin o

完成初始化后,自动打开接受消息监听的线程,通过阻塞等待接收消息队列中的请求消息消息到达;当检测到队列中存在RTSP请求消息消息时,读取消息消J息的方法,再进入是否是会话((seesion)的请求消息判断,如果是会话的请求消息,则先读相应的session ID再根据session ID来读取相应会话的状态,并根据此状态和请求消息进行相应的处理.。如果不是与会话相关的请求消息,则以初始状态开始进入请求的事件服务。

RTSP控制通过单独协议发送的流,与控制通道无关[[35]。所以本视频监控系统设计为RTSP控制通过TCP连接,而数据流通过 UDP。因此,即使媒体服务器没有收到请求,数据也会继续发送。正是因为控制通道与数据通道相互独立,所以流媒体服务器需要维护一个“会话状态”来完成流控制与数据传送的关联。

在上面实现的方法函数中rtsp_SETUP(), rtsp_PLAY(), rtsp_TEARDOWN()需要与服务器的状态机配合来使用,因为这些函数与服务器上的媒体流服务所需要的资源分配和使用密切相关。

在服务器确定请求消息所属的会话后,即根据会话所在状态进入相应的事件服务。

图5.10是状态转移示图:

图5. 10 RTSP状态转换图

可见,状态机的状态转移都是以接收到的RTSP请求消息为触发、进行相应的处理调用后而完成状态转移的。监控系统共有Init, Ready, Playing三种会话状态。其中Init既是状态机状态的起点又是终结点,无需请求消息的触发即进入,而且所有处理的相关状态调用都会使得状态机返回此终结点。OPTIONS,

0 0000

43

000

DESCRIBE,请求都与会话无关,因此都以初始状态为开始,终结点为结束。

5.5本章小结

本章首先分析了整个视频监控系统中数据网络传输所涉及到的协议栈,然后具体分析了其中的RTP/RTCP协议,RTSP协议以及MPEG-4的RTP载荷方法,并给出了关键的实现步骤和主要函数。

第六章 总结与展望

6.1论文总结

本课题针对安防领域视频监控的需求,研究与设计了以嵌入式Linux为操作系统GPRS远程无线视频监控系统。

在论文中,涉及的关键技术有XScale微处理器的体系架构与针对AR1V(-Li~的Bootloader设计、嵌入式Li~内核的板级移植,文件系统设计,这是建立在对ARM- Linux内核和XScale体系架构的理解基础上的;Linux下V4L视频采集程序设计;音频芯片采集驱动,图像数据的识别报警程序,JPEG, MPEG-4压缩程序设计,RTP/RTCP以及RTSP网络视频数据传输的设计与实现。

本课题具体工作及其特色主要体现在以下几个方面:

(1)采用了代表未来主流发展趋势的ARM微处理器作为硬件核心。

(2)软件设计上采用了高性能的嵌入式Linux家族成员ARM-Linux作为软件核心,并充分利用其内嵌的TCP/IP, PPP协议栈进行socket网络编程,多线程编程,在一定程度提高了系统可靠性。

(3)设计了基于边缘的背景去除检测算法,对异常情况判别准确率高。

(4)顺应无线视频监控的发展趋势,采用了MPEG-4视频压缩算法以及优秀的开源编码器XviD,并配以适用于流媒体传输的网络协议,可以提高系统的实时性和兼容性。

(5)提出了一种利用现有的无线网络环境和视频压缩技术,以及网络传输协议的无线视频监控系统设计模型。

6.2研究展望

技术在发展,世界在进步,这一切源于无数人的点滴探索。视频监控与无线通信产业、嵌入式产业大厦的构建也来源于此。目前,对于视频数据的无线网络传输研究与开发正处于蓬勃的发展期。但是,相关的视频压缩算法与网络协议栈结构相对复杂,其可借鉴应用开发资料相对较少,这对研究和开发工作造成了一定难度和障碍。因此,对该技术的研究与应用推广有着重要意义。

0 0000

44

000

参考文献

【1】田泽.嵌入式系统开发与应用.北京:北京航空航天大学出版社,2005

【2】刘峥嵘等.嵌入式Linux应用开发详解.北京:机械工业出版社,2004

【3】马小陆,基于ARM9嵌入式Linux系统开发原理与实践:西安电子科技大

学出版社,2011年。

【4】陈渝等.源码开放的嵌入式系统软件分析与实践一基于SkyEye和ARM开发平台.北京:北京航空航天大学出版社,2004

【5】杜春雷.ARM体系结构与编程.北京:清华大学出版社,2003

【6】刘森.嵌入式系统接口设计与Linux驱动程序开发.北京:北京航空航天大学出版社,2006

【7】宋宝华,Linux设备驱动开发详解,北京:人民邮电出版社,2008年。

【8】韦东山,嵌入式Linux应用开发完全手册,北京:人民邮电出版社,2008

年。

【9】探矽工作室著.嵌入式系统开发圣经(第二版).北京铁道出版社,2003

【10】马善农.无线视频监控系统.江西:东华理工学院,2004

【11】田泽.嵌入式系统开发与应用.北京:北京航空航天大学出版社,2005

【12】Daniel ,Marco Cesati.深入理解LINUX内核.北京:中国电力出版社,2004

0 0000

45


本文标签: 系统 视频 监控 数据 图像