嵌入式Linux开源软件移植与应用.ppt_第1页
嵌入式Linux开源软件移植与应用.ppt_第2页
嵌入式Linux开源软件移植与应用.ppt_第3页
嵌入式Linux开源软件移植与应用.ppt_第4页
嵌入式Linux开源软件移植与应用.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 嵌入式Linux开源软件移植与 应用 第五章 嵌入式Linux接口设计与 驱动程序 主要内容 第一节 嵌入式WebServer GoAhead的移植与应用 第二节 嵌入式WebService gSOAP的移植与应用 第三节 嵌入式数据库SQLite的移植与使用 第四节 播放器Mplayer的移植 第五节 ffmpeg应用 第六节 开源软件移植的一般过程 第七节 J2ME-phoneME移植 第八节 嵌入式浏览器konqueror移植 第五章 嵌入式Linux接口设计与 驱动程序 主要内容 高端嵌入式系统往往基于一个功能强大的操作系统,而使用Linux进行架 构的好处之一就是可以从X86机上移植大量软件做嵌入式开发。本章介绍了 多个软件的移植以及应用,包括嵌入式Web 服务 GoAhead、嵌入式数据库 SQLite、嵌入式媒体播放器Mplayer、JVM phoneMe、Web 服务gSOAP、 Web 浏览器Konqueror。由于Linux软件的开源特点以及交叉编译工具的使用 ,向嵌入式平台上移植丰富的软件成为一件非常轻松的事情。需要特别注意 的是相关软件的版本与依赖关系,包括交叉编译器。 内容: 一、嵌入式Web服务器 二、GoAhead介绍 三、GoAhead在ARM平台上的移植 四、页面操作 第一节 嵌入式WebServer GoAhead的移植与应用 随着后PC机时代的到临,计算机的发展已经从以PC机为中心转向了以 嵌入式系统为中心的方向:嵌入式系统的迅猛发展和IA(信息电器)的 不断成熟使得其应用越来越广泛。其中,嵌入式系统与网络的结合也是 当今发展的一大趋势,而嵌入式网络技术的产生正好迎合了这个趋势。 由于嵌入式系统的专用性强、体积小且价格低廉,使得嵌入式设备已经 开始应用于智能家居系统、工业智能化从站系统、LED网络控制显示屏 系统、网络安全加密系统等各个网络相关领域。 在嵌入式设备中,所谓的瘦Web服务器,即功能不会很全面的Web服务 器,往往拥有有限的资源。因此实现嵌入式WebServer方案的主要技术 难点是:在不影响其整体性能的前提下,如何利用它自身有限的资源, 同时又必须满足Web应用服务器的特征。 第一节 嵌入式WebServer GoAhead的移植与应用 一、嵌入式Web服务器 由下图可以看出:由于HTML语言的标准统一性,只要在嵌入式设备中存在一 个微型服务器,就可以使用任意一种Web浏览器接收和发送信息。所以 如何在嵌入式设备中设计和安装Web服务器,就成了嵌入式Web服务器 的发展和研究方向。 第一节 嵌入式WebServer GoAhead的移植与应用 一、嵌入式Web服务器 GoAhead Webserver是为嵌入式设备的需要而设计的。该Webserver软件不 仅开源,而且具有各种各样的特性,包括支持活动服务页、嵌入Java描 述语言、in-process CGI形式、SSL、文摘访问认证、用户管理和标准 CGI等,脚本大小仅为60K。这对于那些需要在基于浏览管理模式的设 备上传递动态信息的系统管理开发人员来说,这点非常重要。 GoAhead Webserver支持多种操作系统和开发平台,包括Windows NT/98/95 、Windows CE、Embedded Linux、Linux、VxWorks、QNX和Lynx等 ,它也有其它操作系统的定制产品,因此具有很强大的可移植性。 GoAhead网络服务器的发展同时也促进了嵌入式网络服务器的源代码的 进化。由于其开源,世界各地的厂商和爱好者都纷纷下载并优化 GoAhead的源代码,这也使得GoAhead WebServer成为市场上最优秀 的嵌入式网络服务器之一。 作为一款嵌入式Web服务器,GoAhead具有如下特点: 优点:免费,体积小巧,支持多平台,完全针对嵌入式系统设计,支持嵌入 的JavaScript与动态数据页。 缺点:其对ASP的支持意味着要依靠微软的平台,安全方面的考虑很少。 第一节 嵌入式WebServer GoAhead的移植与应用 二、GoAhead介绍 完成GoAhead移植后,需要在此基础上完成系统运行所需要的页面文件,透 过页面文件来实现Web对终端的管理。 页面操作方式有三种,如下介绍 所示: 1,静态页面 静态页面可在http编辑工具中完成,完成直接下载至相应的Web存放目录即可 ,此种方式可完成诸如说明文档、终端信息等固定内容,但无法和用户 进行交互操作。 2,cgi页面 cgi页面,即可用C语言编辑的页面,其操作方式可参考cgitest.c文件(该文件 存放在GoAhead2.18webcgi-bin目录下),使用时需要将此文件加入 项目中一起编辑。GoAhead WebServer任务启动后,在地址栏中直接 输入21cgi-bincgitest(其中21为Web服务器的 IP地址)就可以观察到相应结果。GoAhead的cgi入口处理中,在地址 栏内如果带有cgientry=name的字样时,则处理器会寻找name函数来处 理该请求,相反,如果没有此请求字样时,GoAhead搜索名称为 name_cgientry的函数,即请求的名称增加后缀_cgientry;另外需要注 意的是cgi任务的退出要使用return,而不是使用任务删除,return退出 后,系统会重新定位stdin、stdout等,否则由cgi重定位的输入输出会保 持,会影响后续的其他类型的Web请求。 第一节 嵌入式WebServer GoAhead的移植与应用 四、页面操作 3,嵌入式Javascript 嵌入式Javascript是GoAhead WebServer提供的一种方式,其采用表单提交 的方式,提供了完善的输入输出流程控制,同样可采用C语言进行设计 ,可很好的与系统其它部分实现代码共享。如Today is ,此句代码即可在网页上输出“Hello World”字样。 由于采用表单提交的方式,通过特殊的标记印记,嵌入已经实现的C函数至页 面文件中,在提交时,由已经在系统定义并注册的函数来接收处理,通 过代码写Web页面来实现输出。其设计过程主要涉及以下几个方面: 1)页面设计。嵌入式Javascript文件为asp文件,其内容可按照标准的 javascript来设计,在创建页面过程中,如果需要从原系统中动态生成页 面,如当前终端的参数配置,此时需要使用嵌入式Javascript的独立定 义,在需要嵌入创建函数的地方用如下格式加入:,此函数需要事先定义好并在系统启动向 WebServer注册完成。 第一节 嵌入式WebServer GoAhead的移植与应用 四、页面操作 2)创建函数定义:一个标准的创建函数int aspCreateHomeAsp(int eid, webs_t wp, int argc, char_t *argv),前面两个参数为页面参数,不能改动。 3)注册创建函数: websAspDefine(T(“CreateCurrentUser“), aspCreateHomeAsp)使用此函数注册后,如果asp页面 中出现,则WebServer会 调用aspCreateHomeAsp()来输出页面。 4)Form提交函数:要达到交互使用,则必须响应用户提交 ,要做到这一点,很简单,在页面中加入 , 其中AddGroup即为响应时系统调用的注册后的函数。 当然,需要提交的按钮项需在此form体内完成。其函数 格式为:static void formAddGroup (webs_t wp, char_t *path, char_t *query)。 5)注册Form提交函数:websFormDefine(T(“AddGroup“), formAddGroup),webServer运行此函数后,当页面用 提交 时则调用formAddGroup()函数来处理。 第一节 嵌入式WebServer GoAhead的移植与应用 四、页面操作 内容: 一、gSOAP介绍 二、gSOAP裁减 三、gSOAP应用 第二节 嵌入式WebService gSOAP的移植与应用 Web Service是近几年较为流行的Web应用开发技术。它改变了传统的 B/S或C/S软件开发模式,为软件实体之间共同协作提供了公共平台。而 这里我们所使用的gSOAP则是其中非常方便使用在嵌入式系统上的编译 工具。 gSOAP编译工具提供了一个SOAP/XML关于C/C+语言的实现,它利用 编译器提供了一组透明化的SOAP API,这就将与开发无关的SOAP实 现细节对用户隐藏起来。因此,使用gSOAP工具生成程序非常方便。 gSOAP的使用范围也非常广泛,能够集成C/C+代码、Fortran代码、 其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统 ,语言环境等等。gSOAP包含一个WSDL生成器,可以生成Web服务的 解释。通过gSOAP的解释器以及导入器,用户可以不需要分析Web服 务的细节就能够实现一个客户端或者服务端程序。 gSOAP可以理解为一个C/C+的Web服务协议栈,该协议栈主要包括五 部分:网络传输,Web服务调用(消息传输),Web服务描述与注册( 接口描述、发布与发现),Web服务质量(安全性,可靠性,事务控制 ),Web服务工作流(商业流程、事务等) 第二节 嵌入式WebService gSOAP的移植与应用 一、gSOAP介绍 第二节 嵌入式WebService gSOAP的移植与应用 一、gSOAP介绍 虽然gSOAP实现Web服务协议栈比较复杂,但是用gSOAP开发Web Service是非常方便的。gSOAP工具包中提供了两个可执行文件, wsdl2h和soapcpp2。 wsdl2h用来解析wsdl文档生成描述服务的C/C+头文件,例如你可以用如下 的命令将一个wsdl文档转换为一头文件: $ ./wsdl2h o outputfile.h inputfile.wsdl 上面的命令根据制定URL提供的WSDL文档生成一个C+语法结构的头文件。 假如需要生成一个纯C的头文件,需要用如下命令: $ ./wsdl2h c o outputfile.h inputfile.wsdl 其中inputfile.wsdl可以是本地文件系统上的文件,也可以存在于Web页上,例 如: $ ./wsdl2h -c -o outputfile.h http:/xxx.xxx.xxx/xxx/inputfile.wsdl soapcpp2用来解析上面生成的头文件并生成框架代码,这些框架代码是: soapStub.h 从输入头文件生成的经过修改且带名称空间前缀的头文件, soapH.h 主头文件,所有客户机和服务源代码都要将其包括在内, soapC.c 指定数据结构的序列化器和反序列化器,soapClient.c客户机 存根例程,soapServer.c服务器端存根例程 第二节 嵌入式WebService gSOAP的移植与应用 一、gSOAP介绍 另外,在gSOAP工具包中还包含两个重要的文件:stdsoap2.h和stdsoap2.c/cpp 。其中stdsoap2.h是stdsoap2.c/cpp 运行时所需库的头文件, stdsoap2.c/cpp是运行时 C/C+ 库,带 HTTP/SOAP 解析器和运行时支持 例程。用户可以用这两个文件和上述的框架代码方便的进行客户端/服务器 端开发。 第二节 嵌入式WebService gSOAP的移植与应用 一、gSOAP介绍 用gSOAP开发的Web Service 服务器端和客户端的交 互模型,如图所示。从 图中可以看出:soapC.c 和stdsoap2.c是构成客 户机与服务端的重要的 源文件,其中soapC.c是 上面提到的序列化器和 反序列化器,当建立请 求或响应时需要用到它 的序列化功能,而解析 请求或响应时需要用到 它的反序列化功能。 stdsoap2.c是gSOAP工 具包提供的HTTP/SOAP 解析器 第二节 嵌入式WebService gSOAP的移植与应用 一、gSOAP介绍 裁减gSOAP是为了将Web服务协议栈移植到嵌入式系统中,这类似于向嵌入式系 统中移植TCP/IP协议栈。裁减的目的并不是得到一个比较通用的精简Web服 务协议栈,而是从某个应用角度出发来对gSOAP进行裁减。 1超文本传输协议HTTP协议 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向 应用层的协议。它是一种通用的,不分状态(stateless)的协议,除了诸如 名称服务和分布对象管理系统之类的超文本用途外,还可以通过扩展它的请 求方式,错误代码和报头来完成许多任务。由于HTTP的使用极为广泛,使得 SOAP常常采用HTTP作为底层通讯协议。 1) HTTP Cookie HTTP Cookie是在HTTP连接期间浏览器与CGI程序之间传递的信息。在没有涉及 到浏览器与CGI程序之间通信的程序中,该功能可以被裁减。 第二节 嵌入式WebService gSOAP的移植与应用 二、gSOAP裁减 2) HTTP Chunked编码 有时服务器生成HTTP回应是无法确定消息大小的,这时用Content-Length就无法 事先写入长度,而需要实时生成消息长度,这时服务器一般采用Chunked编 码。如果HTTP回应的消息长度是可以确定的而且比较小,则可以不支持 HTTP的Chunked编码方式。 3) HTTP Proxy 它的主要功能就是通过网上的代理服务器代理用户去取得网络信息。如果在客户与 服务器之间没有设置代理服务器,则HTTP Proxy的功能不必在系统中实现。 4) HTTP Keep-Alive Keep-Alive功能使客户端到服务器端的连接持续有效,客户端为每个待请求的对象 建立并维护一个新的连接。对于每个这样的连接,TCP要在客户端和服务器 端分配TCP缓冲区,并维持TCP变量。当出现对服务器的后继请求时,Keep -Alive功能避免了建立或者重新建立连接。对于嵌入式设备来说,系统资源非 常有限,因此每次通信完成后应立即释放连接,尽量避免长期占用系统资源 而不释放。 第二节 嵌入式WebService gSOAP的移植与应用 二、gSOAP裁减 2可扩展标识语言协议XML协议 XML(eXtensible Markup Language,可扩展标记语言)是Internet上数据表示 和数据交换的新标准。它是ISO(International Organization for Standardization,国际标准化组织)的SGML(Standard for General Markup Language,通用标记语言标准)的一个简化子集。XML关注信息本 身,是Web上表示结构化信息的一种标准文本格式。与传统的注重页面信息 显示的HTML(HyperText Markup Language, 超文本链接标示语言)相比, 关注于内容的XML具有以下诸多优点:良好的可扩展性,语言简单有效,可 自行定义标记;内容与形式的分离,主要刻画数据内容,不考虑显示效果; 有严格的语法要求,便于分析统一和与数据库信息转换;便于传输,为纯文 本形式,可通过HTTP协议直接传输,可跨越防火墙等等。gSOAP工具包中 提供了XML解析器,但是对于具体的应用而言,不必对XML协议完全解析, 经过分析gSOAP源代码,可以对XML协议作如下的精简: 第二节 嵌入式WebService gSOAP的移植与应用 二、gSOAP裁减 1) 精简编码方式 XML文档一般采用UTF-8编码方式,UTF-8可以处理目前世界上使用的每一种文字 。虽然还有少数空白,但是越来越不明显,被逐渐填平了。没有纳入的文字 通常也没有其他任何字符集实现过,即使有也不能在 XML 中使用。如果对于 某个嵌入式系统而言采用UTF-8编码方式已经足够了。那么对于其他的编码 方式,解析器可以不支持。 2) CDATA部件 如果一个XML元素的文本中包含了大量非法的xml字符如“,一个 可选的SOAP头和一个必须的SOAP体。其中SOAP头的作 用就是提供了一个可伸缩的机制用于在分散的模块化的环境下扩展SOAP消 息,而通讯双方并不需要有预先的约定。可以通过它传递一些辅助性的附加 消息,比如身份验证,会话等。如果SOAP头是可选的且不被使用,那么可 以将SOAP头裁减掉。 2) 数据编码规则 SOAP编码可以简短地描述成简单值和复合值的集合。简单值可以是简单类型,如 整型、浮点型和字符型,或者是内置类型,包括各种数据类型,如字节型数 组和枚举。复合值包括结构、数组和XML架构制定组定义的复杂类型。 gSOAP提供了对上述数据类型的序列化和反序列化规则。在本系统中使用到 的数据类型包括整型、枚举和结构。因此在gSOAP中保留以上类型的序列化 和反序列化规则,而对于其他的数据类型诸如浮点型、数组等不支持其序列 化和反序列化。 第二节 嵌入式WebService gSOAP的移植与应用 二、gSOAP裁减 3) 附件机制 当我们想利用SOAP消息传输图像等二进制数据时,一种最简单的方法是使用类似 Base64的方式对其进行编码,把它转变成对XML安全的一串字符然后放入一 条基于XML的消息中传送。但是这并不是一个有效的方法,因为对二进制数 据进行编码和解码会造成相当大的处理开销,从而影响了应用程序的性能。 这些问题促成了带附件的SOAP消息(SOAP Messages with Attachments (SwA))的开发。带附件的SOAP消息是一种特定于Web Services的技术, 它使用MIME Multipart/Related数据包来随XML消息发送二进制数据和其它附 件,从而避免了编码的开销。目前受到业界广泛支持的是MTOM(Message Transmission Optimization Mechanism,消息传输优化机制)和XOP(XML -Binary Optimized Packaging,XML二进制优化封装)。gSOAP支持 MIME/DIME/MTOM附件传输机制,在本系统中涉及到了二进制图像数据的 传输,起初尝试用MTOM和XOP进行附件传输,但后来发现基于SOAP消息 的附件传输始终不如用socket传输的速度快。对于一个要求获取实时视频数 据的系统而言,采用基于SOAP消息的附件传输并不是一个好的选择。因此 裁减了gSOAP中对SOAP附件机制的实现。 第二节 嵌入式WebService gSOAP的移植与应用 二、gSOAP裁减 4.小结 以上三部分是对Web服务协议栈底层的三个重要协议进行分析并裁减了部分 无关性质。但是对于整个Web服务协议栈来说,这仅仅精简了网络传输层和 Web服务调用层。在它们之上还有Web服务描述与注册层、Web服务质量层 和Web服务工作流层,也可以对它们进行裁剪。如果对于服务的注册与发现 没有将Web服务发布到UDDI注册中心,而是采用简单的分布式发现方式( WS-Inspection),由客户端直接向服务提供者请求一个服务描述的副本,根 据此副本进行Web Service客户端开发,可以不需要UDDI。 在移植gSOAP时,实际上是将该精简后的Web服务协议栈移植到嵌入式系统 中。另外,gSOAP还提供了一些额外的功能如支持多种系统平台、DOM解 析库、利用zlib库压缩数据功能、Plug-in扩展功能、FastCGI以及支持SSL(安 全套接层协议)等。这些功能都可以通过条件编译有选择的实现,在移植的过 程中可以将它们减掉 第二节 嵌入式WebService gSOAP的移植与应用 二、gSOAP裁减 gSOAP应用 一般开发一个gSOAP应用的过程是: 写一个函数声明文件,来定义所有要实现的接口函数,该文件应该还含有 命名空间的相关信息。 创建Makefile文件,来利用gsoapcpp2工具生成框架代码。 写一个服务端的程序,里面应该实现第一步中声明文件里的接口函数。 写一个客户端的程序,接收输入的各参数,链接服务端。 第二节 嵌入式WebService gSOAP的移植与应用 三、gSOAP应用 内容: 一、嵌入式数据库 二、SQLite介绍 三、SQLite在ARM平台上的移植 四、SQLite的使用 第二节 嵌入式数据库SQLite的移植与使用 随着计算机技术与其它学科间的不断交融渗透,数据库应用的范围 更加深入和具体。那些仅适用于PC机、体积庞大、延时较长的数 据库技术已不能满足嵌入式系统开发的需求。 数据库的目标是实现对数据的存储、检索和增删等功能。传统的数 据库产品除提供基本的查询、添加、删除等功能外,也提供了很多 高级特性,如触发器、存储过程、数据备份恢复等。然而,在嵌入 式系统中,由于软硬件资源有限,不可能安装庞大的数据库服务器 ,因此一个简单的基于磁盘文件的数据库系统就可能实现相应的用 户需求,而这仅仅是利用了数据库的基本特性。因此在这种特殊的 应用场合下,传统的数据库就显得过于臃肿了。 嵌入式数据库与传统数据库的区别是:嵌入式数据库采用程序方式 直接驱动,而传统数据库则采用引擎响应方式驱动;嵌入式数据库 的体积通常都比较小,而且具备功能齐全、可移植性强、健壮性等 特点,因此嵌入式数据库常常应用在移动便携设备上。另外由于其 性能卓越的特点,也应用于高性能数据处理场景。 第二节 嵌入式数据库SQLite的移植与使用 一、嵌入式数据库 SQLite是一款轻型数据库,设计目标主要针对嵌入式系统。其占用 资源少,在嵌入式设备中,可能只需要几百K内存就足够了。它能 够支持Windows、Linux、Unix等等主流的操作系统,并且能够跟 很多程序语言相结合,比如Tcl、PHP、Java以及ODBC接口,同 样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系 统来说,它的处理速度更快。SQLite虽然很小巧,但是支持的 SQL语句不会逊色于其它开源数据库。 在的网站上介绍SQLite的特点如下: ACID事务 零配置不需要安装和管理配置 储存在单一磁盘文件中的一个完整 的数据库 数据库文件可以在不同字节顺序的 机器之间自由共享 支持数据库大小至2TB 足够小,250K 速度比大部分的普通数据库操作都要快 第二节 嵌入式数据库SQLite的移植与使用 二、SQLite介绍 简单且易学 包含TCL绑定,通过Wrapper支持其他语 言的绑定 良好注释的源代码,并且有90%以上的 测试覆盖率 独立:没有额外依赖 开源 支持多种开发语言 SQLite发展到现在已经有了很多的版本,直到08年9月22日已经推出了 3.6.3的最新版本。 SQLite在ARM平台上的移植一般要经历以下几个步骤: 1)下载源码包,解压。安装配置交叉编译器。 2)在文件sqliteInt.h里面指定SQLITE_PTR_SZ的值为4,使btree(B树) 有正确的变量大小,否则在ARM开发板上执行时,会出现如下问 题: 在文件btree.c中抛出断言, assert( sizeof(ptr)=sizeof(char*) ); 3)修改configure文件,使其不去检查交叉编译环境。之后执行 configure命令,生产Makefile文件。 4)修改Makefile文件,将BCC变量里的编译器修改为X86的编译器,因 为其编译生成的可执行文件要在宿主机上运行。同时,由于编译生 成的可执行文件sqlite要在ARM开发版上执行,为了方便,我们将 后面指定生成的库libsqlite.la改为libsqlite.a,即编译成静态链接的 形式。 5)去掉可执行文件sqlite中的调试信息,这样可执行文件也将变得很小 。 第二节 嵌入式数据库SQLite的移植与使用 三、SQLite在ARM平台上的移植 完成SQLite的移植之后,我们可以利用它创建一个数据库,实现基本的 SQL语句功能,包括建表、插入、查询、删除等基本操作,如下所 示: # sqlite school sqlite create table std(sno char(8),sname varchar(10),sage smallint); sqlite insert into std values(08000001,Li Lei,17); sqlite insert into std values(08000002,Jim, 18); sqlite select * from std; 08000001|Li Lei|17 08000002|Jim|18 在上面的例子中,我们创建名为school的数据库,并给这个数据库创建 了表std,在表std中插入了两组数据,最后查询该表,显示表中的 数据。 第二节 嵌入式数据库SQLite的移植与使用 四、SQLite的使用 我们可以采用C语言编程,调用SQLite数据库,实现类似上面的操作。 在使用SQLite数据库进行编程时,我们要加上头文件sqlite.h,它 是SQLite的API头文件。 SQLite数据库中提供的接口主要有: sqlite_open ( string filename , int mode , string static AVFormatContext *input_filesMAX_FILES; AVCodecContext 保存AVCodec指针和与codec相关的数据,如视频的宽度和高度,音频 的采样速率等。AVCodecContext中的codec_type和codec_id二个 变量对于解码器和编码器的匹配来说,最为重要。 enum CodecType codec_type; /* see CODEC_TYPE_xxx */ enum CodecID codec_id; /* see CODEC_ID_xxx */ 如上所示,codec_type保存的是CODEC_TYPE_VIDEO, CODEC_TYPE_AUDIO等媒体类型,codec_id保存的是 CODEC_ID_FLV1,CODEC_ID_VP6F等编码方式。 第五节 ffmpeg应用 四、ffmpeg中几个重要的数据结构 AVStream AVStream结构保存与数据流相关的编解码器,数据段等信息。比较重 要的有如下二个成员: AVCodecContext *codec和void *priv_data 。其中codec指针保存的就是编码器或解码器的结构;priv_data指 针保存的是和具体编解码流相关的数据。 AVInputStream和AVOutputStream 根据输入和输出流的不同,前述的AVStream结构都是封装在 AVInputStream和 AVOutputStream结构中,在av_encode( )函数 中使用。 AVInputStream中还保存的有与时间有关的信息。 AVOutputStream中还保存有与音视频同步等相关的信息。 AVPacket AVPacket是用于保存读取的包数据。 在视频文件中将会读取不同的音频流、视频流到这个数据结构中。 第五节 ffmpeg应用 四、ffmpeg中几个重要的数据结构 采用ffmpeg进行应用开发时不得不用到两个库:libavformat和 libavcodec。许多视频文件格式,如AVI实际上并没有明确指出应 该使用哪种编码来解析音频和视频数据;它们只是定义了音频流和 视频流如何被绑定在一个文件里面。而libavformat就是用来处理解 析视频文件并将包含在其中的流分离出来,libavcodec 则处理原始 音频和视频流的解码。 进行任何操作之前,必须先初始化两个库:libavformat和libavcodec。 采用如下函数: av_register_all(); 该函数注册库中含有的所有可用的文件格式和编码器,这样当打开一个 文件时,它们才能够自动选择相应的文件格式和编码器。 第五节 ffmpeg应用 五、ffmpeg应用开发 打开视频文件的代码如下: AVFormatContext *pFormatCtx; const char *filename=“test.mpg“; if(av_open_input_file( 其中函数av_open_input()用来打开输入的音频、视频文件,其参数 pFormatCtx用来保存音频或视频文件的格式;参数filename指定要 打开的文件名;最后三个参数分别描述了文件的格式、缓冲区的大 小和格式参数。我们通过简单地指明NULL或0告诉libavformat库去 自动探测文件格式并且使用默认的缓冲区大小。 接着可以通过参数pFormatCtx进一步获得文件的编码,当找到视频流之 后,可以获得它的编码,接着必须找到合适的编码器打开它,需要 使用下面的函数。 AVCodec *pCodec; pCodec=avcodec_find_decoder(pCodecCtx-codec_id); if(pCodec=NULL) /handle error 第五节 ffmpeg应用 五、ffmpeg应用开发 如下函数,用来打开解码器: if(avcodec_open(pCodecCtx, pCodec)frame_rate中,分母在pCodecCtx -frame_rate_base中。在用不同的视频文件库时,一些编码器如 ASF并不能正确的给予赋值(frame_rate_base用1代替1000)。 可以加上如下代码进行修复: if(pCodecCtx-frame_rate1000 接下来,必须给视频帧分配空间,以便存储解码后的图片: AVFrame *pFrame; pFrame=avcodec_alloc_frame(); 第五节 ffmpeg应用 五、ffmpeg应用开发 最后就可以解码这些视频文件了,解码函数如下: avcodec_decode_video(pCodecCtx, pFrame, 其中参数pCodecCtx是前面得到视频流编码上下文的指针;参数pFrame 是存储解码后的图片的位置;参数frameFinished用来记录已完成 的帧数;参数rawData是输入缓冲区指针,指向要解码的原始数据 ;参数bytesRemaining是输入缓冲区的大小。与其对应的音频文 件的解码函数是avcodec_decode_video()。 包在视频文件中是一个很重要的概念,一个视频文件可能含有多个视频 流和音频流,它们被各自独立存储在固定大小的包里。libavformat 库就是用来解析这些包的,然后交由库libavcodec进行解码处理。 下面两个函数分别用来读取和释放包: av_read_packet(pFormatCtx, av_free_packet( 第五节 ffmpeg应用 五、ffmpeg应用开发 内容: 一、软件移植的概念 二、软件移植过程 第六节 开源软件移植的一般过程 随着Linux操作系统的诞生,其开源、免费、高效等特点,使得使 用Linux操作系统的人数也是与日俱增,成为了使用人数增长速度 最快的操作系统。特别是其开源,使得很多的Linux爱好者纷纷过 来参与讨论和研究,为其编写更加稳定、安全和高效的代码。并且 也有很多志愿者、公司等参与编写Linux操作系统下的软件,这些 软件大部分跟Linux一样也是开源免费的,个别是收费的。因为 Linux的开源、免费、支持多平台,使得其它体系结构的计算机相 拥出现,它们大多使用Linux作为操作系统,这也使得Intel和微软 ,特别是微软首次遭受如此巨大的打击。 非X86体系结构的计算机除了使用Linux作为操作系统之外,它们要 想投入到实践运用当中,还必须依赖相应的软件。由于大部分的软 件都是针对X86平台开发的,并且这些软件大多是应用软件,其实 现都要经过操作系统,而不管底层硬件的细节。Linux操作系统上 运行的软件也是如此,并且大多开源。又因为单独为一台嵌入式设 备开发一个应用软件所发的时间和成本都是巨大的,因此,我们直 接采用这些开源软件,针对特定的非X86平台,做适当修改,使它 们能够正常地运行于这种平台,这个过程就叫移植。 第六节 开源软件移植的一般过程 一、软件移植的概念 当要对一个软件进行移植时,我 们必须有一定的理论和实 践基础,首先要能够充分 地掌握软件移植的目标平 台,包括对目标硬件平台 的体系结构要有一定的了 解,熟练掌握目标平台的 操作系统等。其次,我们 还要对移植的软件有全面 的认识,如软件的功能、 支不支持目标平台、软件 目录结构等都要预先知道 ,甚至对软件的源代码也 必须能够读懂。 第六节 开源软件移植的一般过程 二、软件移植过程 该过程具体分成如下三个步骤: 准备工作 包括准备好软件的源码安装包、安装相应的交叉编译器、设置并配置相应的环境变量等实验环 境。 开始移植 移植前首先查看一下软件源码包中的Readme文件,一般软件开发者会在这个文件中对软件给 予一定的说明。Readme文件也可能含有软件的安装步骤,我们可以按照这个步骤进行移 植。大部分软件的移植或者安装都是进入源码目录,然后执行configure命令,生成 Makefile文件,最后执行make和make install命令进行编译生成可执行程序。 有时候软件本身很大,占用的资源太多,而我们需要软件的功能却很有限,这样我们有必要先 对软件进行裁减。我们也可以在执行configure命令的时候带上一些选项,禁止掉我们不 需要的功能。这样,当执行make命令编译时就不会把这些功能编译进去,使我们的可执 行程序足够小。 在执行make命令的时候,难免会遇到编译出错的问题。这时候,首先我们要保证Makefile文件 中使用的编译器是否正确,这里的编译器不一定都是交叉平台的编译器,有些程序可能 需要在宿主机上执行,这时编译这个程序选用的就是X86平台的编译器。其次,我们查看 一下具体编译出错的问题,这时候一般涉及到具体的源代码,针对出现的问题,加以修 改后重新编译。 当编译没有出现问题,生成可执行程序后,可以进行下一步。 第六节 开源软件移植的一般过程 二、软件移植过程 运行并测试 我们可以将编译后的可执行程序下载到目标机上运行。如果运行 正常,就可以算是移植成功。如果不能运行或是运行的效 果不佳,那就有必要找出原因,加以解决后重新编译,直 到生成的可执行程序正常地在目标机上运行。 特别需要注意的是,选择软件时,需关注它们本身的版本和相互 依赖关系,因为某些软件体本身它不是孤立的,而且在其 开发过程时也有特殊的环境。 第六节 开源软件移植的一般过程 二、软件移植过程 内容: 一、phoneME介绍 二、软件移植过程与效果 第七节 J2ME-phoneME移植 当今JVM种类很多,如IBM JVM、MS JVM等等。J2ME(Java 2 Platform Micro Edition)是专为移动设备设计的,在移动通信设 备上已经有了很广的应用,非常适合我们在嵌入式中使用。 J2ME根据硬件资源的限制,分为CLDC (Connected Limited Device Configuration)和CDC (Connected Device Configuration),无论是CLDC还是CDC,其核心都是Java虚 拟机。CLDC采用了KVM,它是一个真正的最小的而又基本上 完整的Java虚拟机,小到可以装入几十KB的内存中。CDC则采 用了CVM,它是一个具有完整的J2SE1.3 VM支持能力的Java 虚拟机,因此也更适合使用、更有效,但又比标准的J2SE VM 小。 作为一个全功能的Java虚拟机,CVM几乎支持J2SE VM的所有先 进特性,包括最底层的调用、出错处理和本地语言接口。SUN 的JVM开源后,作为JAVA开发社区的一个项目,为避免版权问 题,J2ME改名为phoneME。CLDC对应phoneME Feature,而 CDC对应phoneME Feature,虚拟机则称为CVM。phoneME Feature展开的。 第七节 J2ME-phoneME移植 一、phoneME介绍 系统要求: GNU make version =3.80 并且 arm-linux-gcc version =3.3.1 1安装jdk #./j2sdk-1_4_2_17-linux-i586-rpm.bin #rpm -ivh j2sdk-1_4_2_17-linux-i586.rpm 2编辑并运行脚本 #vi setup.sh #vi teardown.sh -Building PCSL #vi build-pcsl.sh #sh build-pcsl.sh -Building CLDC #vi build-cldc.sh #sh build-cldc.sh -Building Java Wireless Client Software 修改文件phoneme_feature/midp/build/linux_qte_gcc/qte.gmk 第66行添加: -ljpeg -lts #sh build-sjwc.h 注意:最后一步如果编译出现libobj.a含有未知参数的话,将output目录删除,然 后从第一步重新编译. 第七节 J2ME-phoneME移植 二、软件移植过程与效果 3环境变量设置与运行 Running Java Wireless Client Software Now what do you do with it? To run the software, copy the following three directories to your Linux ARM hardware: $MIDP_OUTPUT_DIR/appdb $MIDP_OUTPUT_DIR/bin $MIDP_OUTPUT_DIR/lib cp -r $QTEDIR/li

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论