基于Web嵌入式视频监控精品资料.doc

上传人:封****n 文档编号:96698498 上传时间:2024-03-10 格式:DOC 页数:27 大小:317KB
返回 下载 相关 举报
基于Web嵌入式视频监控精品资料.doc_第1页
第1页 / 共27页
基于Web嵌入式视频监控精品资料.doc_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《基于Web嵌入式视频监控精品资料.doc》由会员分享,可在线阅读,更多相关《基于Web嵌入式视频监控精品资料.doc(27页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、 嵌入式软件设计课程设计报告-基于Web的嵌入式视频监控 姓 名: 专 业:信息工程 班 级: 指导教师: 2010年 11月 2日 目 录一实验目的1二实验要求1三实验内容1四实验步骤3五实验源代码7六学习心得14七参考文献15基于Web的嵌入式视频监控一实验目的:通过本课程设计使学生加深理解、巩固课堂教学和平时实验内容,使学生初步完成基于web的嵌入式视频监控的设计,强化学生的知识实践意识、提高动手能力,发挥学生的想象力和创新能力,从而培养工程应用型人才。 二实验要求: 1.完成题目的基本内容与要求2.提交课程设计报告,课程设计报告应包括:系统设计要求,设计思路,系统功能模块图,系统流程图

2、,类的层次图(包括类成员列表),调试过程,关键程序代码,总结,参考书目等。三实验内容:目前,以网络为基础的数字视频监控系统是视频监控系统发展的主流,而随着微处理器技术、计算机网络技术的进步,基于嵌入式WEB的网络视频监控系统逐渐得到了人们的广泛关注,其主要原理是:嵌入式视频服务器采用嵌入式实时操作系统,内置嵌入式WEB服务器,摄像机传送过来的视频信号经高效压缩芯片压缩后,通过内部总线传送到内置的WEB服务器。用户在监控端可以直接通过浏览器观看WEB服务器上的摄像机视频图像,授权用户还可以控制摄像机云台镜头的动作。本文所述的监控系统的原理图如图1所示。图 1 嵌入式视频监控系统示意图四实验步骤:

3、 (一) 实验分析本系统由摄像机、嵌入式WEB服务器、传输网络和监控端组成。摄像机用来采集监控现场的视频。嵌入式WEB服务器是整个监控系统的核心,有硬件和软件两个部分,详细结构将在下面分别介绍。其主要功能包括:为监控端提供WEB访问页面;对监控端的访问进行有效性、安全性检查;响应监控端的请求,为监控端提供所需要的视频图像;接收监控端的控制信息,经过软硬件转换后对摄像机进行控制。每个服务器有自己的IP地址,在监控端可以通过浏览器界面访问服务器。监控端的功能则是显示现场视频,并根据需要向服务器发送视频请求以及对摄像机的控制信号。(二)设计流程: 1、 嵌入式 WEB 服务器的硬件结构嵌入式WEB服

4、务器的硬件结构如图2所示。其主要由CPU芯片、MPEG-4音视频编码芯片、Flash芯片、SDRAM内存、以太网络接口、大容量硬盘组成。其中CPU采用MOTOROLA公司的PowerPC系列嵌入式通信处理器MPC8250。MPEG-4音视频编码芯片完成对从摄像头传送过来的视频数据的压缩和编码。根据网络带宽、拓扑结构以及对图像质量的要求,本系统选用基于MPEG-4标准的分层可扩展性编码方案。压缩后的视频数据根据需要,可以存储在大容量硬盘中,或者通过以太网进行网络传输。为了实现视频存储功能,需要采用大容量的硬盘。图 2 嵌入式 WEB 服务器的硬件结构2、嵌入式 WEB 服务器的软件系统嵌入式WE

5、B服务器的软件设计与实现是本系统实现的关键之一,包括嵌入式操作系统与应用软件两大部分。(1) 嵌入式操作系统嵌入式操作系统是支持嵌入式系统应用的操作系统软件,是在系统实时性、硬件相关性、软件固态化等方面有着突出特点的专用操作系统。本系统采用嵌入式LINUX操作系统,它是在根据系统需要对LINUX操作系统进行小型化裁剪与实时化的基础上实现的。使用LINUX的优势在于:其操作系统的源代码是开放的,可根据需要进行定制;系统内核小,因而对硬件的要求相对要低;支持多任务多进程,能提供较好的实时性。 (2) 应用软件服务器的应用软件结构如图3所示。其主要由WEB服务器、CGI程序、嵌入式数据库mSQL、视

6、频调度与传输模块、存储管理与调度模块、摄像机控制模块等几个重要部分组成。(3)WEB服务器与CGI程序WEB服务器通过HTTP协议与监控端浏览器软件进行信息交互,提供其他应用程序模块的接口以及视频数据浏览界面和摄像机控制界面。此外,它还要对监控端的访问权限进行控制,过滤监控端的请求和控制信息,处理多个监控端的请求和控制的同步和优先级问题。 本系统选择适合于嵌入式系统的Boa WEB服务器。Boa是一个单任务的HTTP服务器,支持能够实现动态WEB技术的CGI技术,源代码开放、性能高。同时服务器程序本身所占空间很小,因而十分适用于嵌入式系统。 同时,本系统采用了CGI(公用网关接口) 来实现动态

7、WEB技术,CGI规定了WEB服务器调用其他可执行程序(CGI程序)的接口协议标准。WEB服务器通过调用CGI程序实现和浏览器的交互,也就是CGI程序接受浏览器发送给WEB服务器的信息,进行处理,将响应结果再回送给WEB服务器及浏览器。原则CGI程序可以用任何程序设计语言编写,但是用C语言编写的CGI程序具有执行速度快、安全性高等特点。图3 嵌入式 WEB 服务器的应用软件结构(4)嵌入式数据库mSQL在本系统中,用户信息的存储,用户的登录登出,视频设备参数的存储与查询,视频文件的存储与查询等,都需要一个嵌入式数据库。综合考虑,本系统使用mSQL(MiniSQL)作为本系统的后台数据库。mSQ

8、L是一款优秀的嵌入式数据库,体系结构小巧,占用系统资源少,特别适合在嵌入式Linux系统中使用。同时,mSQL提供专门的API函数,使得用C语言编写的CGI程序可以与mSQL的数据库引擎进行通信。 (5)视频调度与传输模块视频调度与传输模块为监控端提供所需的实时视频信息,是服务器应用软件中最重要的模块。该模块根据所采取的网络传输与控制协议与监控端建立连接,监听监控端的请求;同时又根据不同的服务类型采取相应的调度策略创建视频流,然后将视频数据分组、打包,发送到监控端,并根据路由器和监控端反馈的网络状态信息进行差错处理和拥塞控制。视频数据的传输一般采UDP网络通讯协议,而采用UDP的IP传送方式有

9、点播、广播和组播三种,其中组播是服务器只向特定的用户组发送一个数据包,组中的各用户可以共享这一数据包,而组外的用户却无法接收到。本系统采用IP组播方式,采用组播技术的优点有以下几点:可以让服务器承担大量客户端的视频数据播送要求;由于数据包拷贝数量和发送目的地址少,大大减少了网络中传输的数据总量,从而保证较高的服务质量;减小了视频数据流传输的带宽占用,减轻了服务器的负担。本系统采用的网络传输协议使用RTP/UDP/IP模型。RTP协议是一种提供端对端的实时媒体传输服务的协议,由实时传输协议RTP和实时传输控制协议RTCP两个部分组成。RTP用于实时视频数据的传输,而RTCP则用来监控实时视频数据

10、的传输。RTP/UDP/IP的方式兼顾了视频传输的实时性与QoS保证。同时针对传输网络状况的不确定性,还可以采取一定的拥塞控制和差错控制策略。(6)存储管理与调度模块存储管理模块的主要功能是将压缩和编码后的视频信息根据一定的策略存储至磁盘中特定的区域,并将视频文件信息存储到嵌入式数据库中,以供检索与回放,同时响应视频调度与传输模块的请求,按照一定的磁盘调度策略和优先级顺序从磁盘中读取视频数据至内存缓冲区。对于存储管理,本系统采用等长分组存储策略,即将视频信息按照时序关系分割成若干数据单元,这些数据单元称为分组,将每个分组存储于一个大小固定的存储单元内。(7)摄像机控制模块摄像机控制模块主要实现

11、对摄像机的控制。在监控端,用户通过浏览器向WEB服务器发送摄像机控制命令,该控制命令经WEB服务器接受和处理后,再通过CGI程序发送给摄像机控制模块,然后被转换成相应的对摄像机控制的硬件操作指令,从而实现对摄像机云台镜头的远程控制。3 监控端浏览本系统在监控端使用浏览器对监控现场进行监控,浏览器所运行的平台与嵌入式WEB服务器所运行的平台独立,浏览远程视频时不需要任何第三方软件,从而实现了跨平台。使用本系统在监控端浏览视频的界面如图4所示。图 4 监控端浏览视频界面五、关键程序代码#include #include PSDemuxMP4.h#define VIDOBJLAYER_StartCo

12、de 0x20010000 #define Min_ParseBytes 12#define DIMINSION_LIMIT_MIN#defineDIMINSION_LIMIT_MAX#define VIDOBJLAY_AR_EXTPAR#define VIDOBJLAY_SHAPE_RECTANGULAR#define VIDOBJLAY_SHAPE_BINARY_ONLY#define VIDOBJLAY_SHAPE_GRAYSCALEstatic unsigned int log2bin(unsigned int value)int n = 0;if (value & 0xffff000

13、0)value = 16;n += 16;if (value & 0xff00)value = 8;n += 8;if (value & 0xf0)value = 4;n += 4;return n + log2_tab_16value;typedef structint pos;unsigned char * tail; /*unsigned char * start;int length;int initpos;*/Bitstream;static intBitstreamGetBits(Bitstream * bs, const int n)int tmp;int ret;memcpy(

14、&tmp,bs-tail,4);/*tmp = *(int*)bs-tail) ;*/#ifndef ARCH_IS_BIG_ENDIANtmp = (tmp 24) & 0xff) | (tmp 8) & 0xff00) | (tmp & 0xff) 24) | (tmp & 0xff00) 8);#endifret = (tmp pos) (32 - n);bs-pos += n;bs-tail += bs-pos3;bs-pos &= 7;return ret;static intBitstreamGetBit(Bitstream * bs)return BitstreamGetBits

15、(bs, 1);/* skip n bits forward in bitstream */static voidBitstreamSkip(Bitstream * bs, const int bits)bs-pos += bits;bs-tail += bs-pos3;bs-pos &= 7;int check_MP4_frame_head(unsigned char *Buf, int len)if (Buf = NULL | len 4)return -1;if (Buf0 = 0x00 & Buf1 = 0x00 & Buf2 = 0x01)if (Buf3 = 0xb6)switch

16、(Buf4 & 0xc0)case 0x00:return 3;case 0x40:return 2;case 0x80:return 1;default: return -1;elsereturn 3;elsereturn 0;int seek_MP4_video_dimension( unsigned char *stream_ptr, unsigned int length, unsigned int *width, unsigned int *height )unsigned char *ptr = stream_ptr;int word0;int word1 = 0xf0ffffff

17、;unsigned int i;int bit_cnt;unsigned int tmp;Bitstream str_bs;Bitstream *bs = &str_bs;int vol_ver_id;int aspect_ratio;int shape;int time_inc_resolution;int time_inc_bits;if (length Min_ParseBytes)return ERR_BITSTREAM_TOO_SMALL;for (i = 0; i tail = ptr + i + 4;bs-pos = 0;if (length - i - 4 3);if (tmp

18、 + 10 + 7 length) return ERR_BYTES_NOT_ENOUGH;BitstreamGetBits(bs,15);/* first_half_bit_rate */READ_MARKER();BitstreamGetBits(bs,15);/* latter_half_bit_rate */READ_MARKER();BitstreamGetBits(bs, 15);/* first_half_vbv_buffer_size */READ_MARKER();BitstreamGetBits(bs, 3);/* latter_half_vbv_buffer_size *

19、/BitstreamGetBits(bs, 11) ;/* first_half_vbv_occupancy */READ_MARKER();BitstreamGetBits(bs, 15);/* latter_half_vbv_occupancy */READ_MARKER();bit_cnt += 79; else/*dec-low_delay = dec-low_delay_default;*/shape = BitstreamGetBits(bs, 2);/* video_object_layer_shape */if (shape != VIDOBJLAY_SHAPE_RECTANG

20、ULAR)if (shape = VIDOBJLAY_SHAPE_GRAYSCALE & vol_ver_id != 1) BitstreamSkip(bs, 4);/* video_object_layer_shape_extension */READ_MARKER();/* for decode B-frame time */time_inc_resolution = BitstreamGetBits(bs, 16);/* vop_time_increment_resolution */if (time_inc_resolution 0) time_inc_bits = log2bin(t

21、ime_inc_resolution-1) 1 ? log2bin(time_inc_resolution-1) : 1; else/* for old xvid compatibility, set time_inc_bits = 1 */time_inc_bits = 1;READ_MARKER();if (BitstreamGetBit(bs)/* fixed_vop_rate */BitstreamSkip(bs, time_inc_bits);/* fixed_vop_time_increment */if (shape != VIDOBJLAY_SHAPE_BINARY_ONLY)

22、if (shape = VIDOBJLAY_SHAPE_RECTANGULAR)READ_MARKER();*width = BitstreamGetBits(bs, 13);/* video_object_layer_width */READ_MARKER();*height = BitstreamGetBits(bs, 13);/* video_object_layer_height */READ_MARKER();if (*width DIMINSION_LIMIT_MIN | *height DIMINSION_LIMIT_MAX | *height DIMINSION_LIMIT_M

23、AX)return ERR_W_H_INFO_ILLEGAL;return SEEK_W_H_SUCCESS;return ERR_W_H_INFO_ILLEGAL;return ERR_NOT_FIND_VIDOBJLAYER_STARTCODE;六学习心得本次课程设计介绍了一个基于嵌入式WEB技术的网络视频监控系统的设计与实现,与传统的网络视频监控系统相比,本系统的主要特点在于:服务器的设计基于嵌入式WEB技术;支持动态IP,可以直接连入以太网,能够即插即看;用户无需使用专用软件,仅用浏览器即可观看;同时系统采用先进了的MPEG-4编码标准,在提高了视频质量的同时大大减少了数据量。相信随着

24、网络视频监控的流行,基于嵌入式WEB的网络视频监控系统必将有良好的发展前景。七参考文献1符意德主编.嵌入式系统设计原理及应用. 北京:清华大学出版社,2004.2王勇编著.嵌入式系统原理与设计. 杭州:浙江大学出版社,2007.3马忠梅.ARM嵌入式处理器结构与应用. 北京:北京航空航天大学出版社,2002.5王田苗主编.嵌入式系统设计与实例开发. 北京:清华大学出版社,2002.附录资料:从 XML 生成可与 Ajax 共同使用的 JSON时下,非常流行使用 JavaScript 代码为数据驱动的 Web 应用程序添加互动性。若能将数据编码成 JavaScript Object Notati

25、on(JSON)的格式,您就可以更轻松地通过 JavaScript 语言使用它。通过本文,发掘使用 XSLT V2 从 XML 数据生成 JSON 的几种不同方法。几年前,许多开发人员很看好 XML、XSLT、Extensible HTML (XHTML)和其他一些基于标记的语言。现在,Asynchronous JavaScript and XML(AJAX)成了新的热点,人们又将目光转向了使用 JavaScript 代码的数据驱动的富 Internet 应用程序。但是开发人员是否已经消除了 XML 和这一新技术之间的鸿沟呢?当然,您可以在 Web 客户机中使用 XML 解析器来读取数据,但这

26、种做法会带来两个问题。第一,出于安全方面的原因,XML 数据只能从与此页面相同的那个域中读取。这虽然不是什么大的限制因素,但它的确会引起部署方面的问题,还会阻碍 DHTML 小部件的创建。第二,读取和解析 XML 会非常慢。另一种做法是让服务器执行 XML 的解析工作,方法是设置服务器,使之向浏览器发送以 JavaScript 代码或时下流行的 JavaScript Object Notation(JSON)编码的数据。本文将展示如下三种使用 XSLT V2 语言和 Saxon XSLT V2 处理器从 XML 数据生成 JSON 的技巧: l 简单编码 l 通过函数调用加载数据 l 编码对象

27、 JSON 简介要学习如何将数据编码成 JSON(它只是 JavaScript 的一个子集),最好的方法是从数据开始。清单 1 显示了书籍列表的一个示例 XML 数据集。清单 1. 基本的图形化图书馆 Code Generation in Action JackHerrington Manning PHP Hacks JackHerrington OReilly Podcasting Hacks JackHerrington OReilly 这个数据集很简单,只包含三本书,每本书都具有惟一的 ID、书名、作者姓名及出版商的名字。(没错,我只选择了我自己的书作为数据集,但能怨我吗?这些书实在是不

28、可多得的节日和生日礼物。)清单 2 显示了这些数据在 JSON 中的效果。清单 2. JSON 中的示例数据集 id: 1, title: Code Generation in Action, first: Jack, last: Herrington, publisher: Manning , . 方括号 () 表明这是一个数组。大括号 () 则表明这是一个散列表,该散列表由一组名称和值对组成。在本例中,我创建了一个散列表的数组 用来存储这类结构式数据的一种常见方法。另外一点值得注意的是字符串是通过单引号或双引号被编码的。所以,如果我想用单引号编码 OReilly,我就必须使用反斜杠对它进行

29、转义:OReilly。 这让我编写的这个 XSLT 样式表更为有趣了一些。我并未在本例中放上任何日期,但您也可以通过如下两种方法来编码日期。第一种方法是将日期作为字符串,该字符串必须在后面被解析。第二种方法是将日期作为一个对象,比如:publishdate: new Date( 2006, 6, 16, 17, 45, 0 )这段代码将 publishdate 的值设置为6/16/2006 5:45:00 p.m.。简单编码接下来我将陆续介绍 JSON 编码的几种技巧。第一种也是其中最简单的一种,此样式表如 清单 3 所示。清单 3. simple.xsl 样式表 var g_books =

30、1, id: ,name: ,first: ,last: ,publisher: ;要理解此样式表,不妨先来看一下 清单 4 所示的输出。清单 4. simple.xsl 的输出var g_books = id: 1,name: Code Generation in Action,first: Jack,last: Herrington,publisher: Manning, id: 2,name: PHP Hacks,first: Jack,last: Herrington,publisher: OReilly, id: 3,name: Podcasting Hacks,first: Jac

31、k,last: Herrington,publisher: OReilly;这里,我将名为 g_books 的变量设置为一个包含三个散列表的数组,每个散列表包含关于该书的信息。再回过头来看看 清单 3,您会发现第一个模板匹配 / 路径,它也是首先应用到输入数据集的模板,该模板使用 for-each 循环来遍历每本书。之后,它使用 标记来将文本从该数据输出到 JavaScript 输出代码。对于字符串,我使用名为 js:escape() 的定制函数,它在模板之前定义。该函数使用一个正则表达式将一个单引号标记更改为带有反斜杠的单引号标记。最后一个重要的元素是 标记,它告知处理器要输出的是文本而不是

32、 XML。要检验此过程是否可以正常工作,我加入了一个 simple .html 文件,该文件引用我在 simple.js 保存的 XSL 样式表的输出。这个 HTML 文件如 清单 5 所示。清单 5. simple.html 文件Simple JS loaderdocument.write( Found +g_books.length+ books );.html 文件使用 标记简单地加载已编码了的 JavaScript 代码。之后,第二个 标记将数组的长度写出到浏览器页面,如 图 1 所示。图 1. simple.html 的输出好了!数据文件包含三本书,相应的 JavaScript 文件

33、也包含三本书。它真的可以工作!通过函数加载上述第一个示例很简单,而且在大多数情况下可以发挥其作用,但它存在一些问题。第一个问题是对于数据何时被加载没有任何提示。如果数据是像页面那样被静态加载的,这不成问题。但是如果页面动态创建了一个 标记来按需加载数据,那么就很有必要知道 标记是何时完成的。实现此功能的最好的方法是让编码了的数据调用一个 JavaScript 函数,而不是只设置数据。这个概念很重要,所以我将花一些时间来介绍一下为什么您必须要通过动态生成的 标记来加载数据。页面加载后,从服务器获得数据是 Web 2.0 的核心功能。一种方法是使用 AJAX 机制通过到服务器的调用来加载 XML。

34、然而,出于安全性的原因,AJAX 机制只限于从单一域获取数据。这在大多数情况下都没有问题,但有时,您可能需要 JavaScript 代码运行在他人的页面上(例如,Google Maps)。在这种情况下从服务器获得数据的惟一方法是通过动态加载 标记。获悉 标记何时加载的最好的方法是让 标记返回的脚本调用函数而不是简单地加载数据。清单 6 显示了在函数调用中编码的数据。清单 6. Function1.jsAddBooks( id: 1,name: Code Generation in Action,first: Jack,last: Herrington,publisher: Manning, id: 2,name: PHP Hacks,first: Jack,last: Herrington,publisher: OReilly, id

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 施工组织

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com