摘 要
随着越来越多的场合正向自动化无人职守迈进,尤其在安全、监控等领域。为了进一步降低成本,减少人力的投资,以及更集中、更方便的掌握现场情况,许多场合都采用了电子监控设备,如办公室,发电站,机场,海关等等领域。而这些电子设备的设计无疑涉及到这些领域的安全性,这就对监控设备的成本,稳定性,以及性能三方面都提出了更高的要求。
本系统的研究背景主要是根据现有视频监控系统的不足,旨在降低系统的成本和提高系统的性能。它采用了价格低廉的三星应用处理器S3C2410,并使用软件音、视频编解码器,能实现以250Kbps和350Kbps的编码位流速进行网络传输,并以160128和320240两种显示分辩率,可以进行良好的视频监控。同时,它的一个最大的特点是可以在终端上进行录像,而不需要通过PC机,这样既适合低功耗的场合,又可以减少的系统的复杂性。
图像采集终端则采用性价比很高的USB型摄像头,在市场上很容易买到,同时,USB型摄像头具有很好的通用性,驱动程序丰富,可以减少代码的编写。由于本系统使用标准的以太网进行传输,因此系统支持无限个终端进行级联,监控区域可以很轻易的进行扩大。
综上所述,本系统采用ARM9处理器,USB摄像头,标准以太网传输,实现了一个性能良好的视频监控系统。
关键词:嵌入式;Linux;ARM;CODEC;视频监控
1 引言
现在国内的视频监控设备多数采用高成本的DSP处理器+网络传输和专用处理器+模拟传输两种方案,就目前的这两种方案而言,前者不但硬件成本高,而且由于DSP的特性,多数无法运行多任务操作系统,以致系统软件的设计也变得很复杂,通常情况下要重新编写任务管理调度程序,同时还要进行图像采集端程序的设计以及图像编解码程序的设计,无疑,仅此三大类软件设计,其成本便可见高下,除此以外,整个系统的升级尤其是软件的升级造成了很大的阻碍,原因在于没有良好操作系统的支持,应用程序没能与操作系统进行良好的交互。而后者同样也面临诸多问题,首先,专用处理器的优点是内置硬件编解码器,无疑,从性能方面来讲,这是一个优势,但同时也是它的劣势,因为内置硬件编解码器的专用处理器往往价格比普通应用处理器高出许出,虽然利用专用处理器能节省软件的开发周期,换而言之,也就降低了软件开发的成本,但高出的硬件投资,也就恰好抵消了软件的成本,最多也就实现用硬件来弥补软件的成本,而在软件升级方面则和方案一存在相同的问题,到最后,方案也未能比方案一有明显的优势。
那么,如何选择视频监控系统的方案以填补现有监控系统的不足呢?这就是本课题的研究重点,本文就如何进行方案可行性的研究、选择以及验证进行介绍。
2 绪论
2.1 课题研究的目的和意义
近几年来,我国的安防系统的发展相当迅速,特别是近两年为筹备2008年北京奥运会的到来,国家更是投资了大批人力物力进行所有奥运会场的安全防御监控系统升级安装,从北京市的交通到奥运会场的监控,整个市区安装了高达百万个监控终端。这不仅说明监控设备在现在的社会安全领域起着不可或缺的作用,也说明了政府也越来越重视社会集中监控的优越性。
从现代控制理论来看,集散型控制是比较突出的一种控制方式,所以,现在流行的监控系统也同样采用此方法。从系统的上下行模式来区别,监控系统主要有Host-Client模式,也就是主从模式,这种模式主要是采用以太网传输方式,通常情况下可以一个Host实现多个Client终端,因此,监控系统采用此模式可以有效的实现多终端监控,从而节省了资源。
在我国现有的监控系统中,普遍采用的是前面所述的两种系统方案,根据前面的分析可以知道,这两种都不是最理想的方案,因此要真正的向高效化、低成本化发展监控系统,就必须重新设计新的监控系统方案。
本课题主要从实际应用的角度出发,为了进一步解决现有监控系统中的不足,并利用价格上较有优势,软件上更易升级的思想对系统进行了设计,最终以应用处理器+嵌入式Linux操作系统+以太网传输作为整个系统的核心构架,这种方案有效的克服了前面所述的两种监控系统的缺点,极大程度上解决了硬件高成本,软件不易管理的问题。
因此,本课题的研究意义在于通过重新设计监控系统,以改造现有监控系统的不足,主要突出在改变了传统监控方案:DSP处理器+网络传输和专用处理器+模拟传输两种方案,以全新的方案:应用处理器+嵌入式Linux操作系统+以太网传输,不仅具有良好的稳定性,而且从性价比等方面都有非常突出的优势。
3 网络监控系统概述
3.1 系统简介
随着社会的秩序问题日趋严重,为了加强区域的安全性,网络监控系统越来越得到重视,到现在已经广泛的应用于交通、海关、航空等领域。本系统以全新的思路设计,整合了目前嵌入式系统的新技术,从性能、成本,操作方面进行最大的优化,使得本系统能够应用到更多的场合。系统由前端的图像采集和图像压缩,通过以太网把图像数据传输到监控端,在监控端实现现场监控的作用。
3.2 系统组成
网络监控系统是以图像采集端、网络枢纽、宿主端三部分构成。
图像采集端主要是由嵌入式主板组成,其硬件包含:嵌入式处理器、网络控制器、存储器、电源模块等,而软件则包括:嵌入式操作系统、TCP/IP协议栈、存储器管理等。通常所构成的系统的主要功能是采集现场的情况,以某种图像格式进行编码压缩,再通过网络控制器把图像信息传送给宿主端,以达到监控目的。
网络枢纽是指为了实现远程监控的功能,在网络传输过程中,需要多个网络中继站,即网络路由器,通过这种方式,可以进行网络级联,最后达到多点同时监控的目的。即节省了宿主端的数目,同时又简化了操作和管理,实现一主多从的集散型监控方式。
宿主端即监控端,通常以PC主机和显示设备组成。宿主端把各采集点回传的数据进行解压显示,以多窗口的方式显示各个监控点的现场情况,即可达到非常及时的监控效果。
3.3 系统框图
系统框图见 图 3.1
图 3.1系统框图
4 嵌入式系统简介
4.1 主流嵌入式操作系统的比较
嵌入式操作系统以其微小内核、可移植、可裁剪、源码开放的特性在嵌入式领域得到广泛的应用。对于不同的产品,不同的应用场合,可以选择合适的嵌入式操作系统。到目前为此,全世界范围内出现的嵌入式操作系统高达200多种,它们专为嵌入式应用而开发,使得嵌入式产品的开发越来越方便,价格也变得越来越低廉,在航空、通信、娱乐等领域已经得到了很好的应用。
较为流行的嵌入式操作系统有:Linux,Windows CE,VxWorks,μC/OS等等
4.1.1Windows CE
Windows CE是微软公司的产品,它是以Windows操作系统核心作为基础,为有限资源的平台进行简化,并保留了多线程、优先权、多任务、可移植等特性。Windows CE和PC机使用的Windows 操作系统的最大区别是采用了模块化设计,从而使得Windows CE可以安装到存储空间并不大的嵌入式设备,通常Windows CE的内核映像文件最小可以达到200KB,对于现有嵌入式设备的存储空间有限的情况下,Windows CE仍然可以得到非常好的应用。
目前,全球范围内已经有上千家公司采用Windows CE进行各种各样的嵌入式产品开发。典型的新产品有手机、POS终端、ATM终端、工业控制系统等等。当然,Windows CE属于商业产品,当使用Windows CE进行产品开发时,需要支付3美元~20美元的授权费。
4.1.2Linux
Linux是嵌入式领域中发展最快、应用最广的一个操作系统。Linux是在GPL下发行的操作系统,与其他现有的操作系统相比有以下特点:
(1)完全源码开放
(2)可以免费获得
(3)支持数十种不同的处理器
(4)可移植
(5)可裁剪
其中,“免费”和“开源”是Linux最有竞争力的特点。在全球范围内,已经有不计其数的个人、企业正在使用Linux。随着Linux的进一步成熟,它以更小代码尺寸和更多不同平台的支持,大大的减少了新产品的成本和研发时间,吸引了越来越多的设备生产商,到现在,Linux已经成为世界主流的嵌入式操作系统。
根据IDC报告指出,Linux已经成为世界第二大操作系统。并且每年以高于25%的速度增长,再加上基于Linux的变种体,如实时性能较强的RTLinux、RTAI,Kurt和Linux/RK,能在没有MMU处理器上运行的μCLinux,更是把Linux的应用领域扩展到了工业控制和军事工业以及航空工业。
4.1.3VxWorks
VxWorks是WindRiver公司专门为实时系统而设计的一款优秀的实时操作系统。VxWorks以其超微小的内核提供了实时任务调度、中断管理、任务间通信等功能。由于WindRiver已经为VxWorks作了大量的优化工作,其优异的性能和稳定的特点使得程序员只要专心编写应用程序,根本不需要去关心系统内核的管理。除此之外,VxWorks具备完善的网络通信,文件系统等模块,可以应用到各种不同的场合。下面罗列了VxWorks的一些主要特点:
(1)任务间通信机制
(2)网络协议
(3)文件系统
(4)I/O管理
(5)超微小内核
(6)POSIX标准实时扩展
(7)支持C++语言
4.1.4μC/OS
μC/OS是由美国的Jean J.Labrosse编写的一个小型实时操作系统。该系统从1992年开始至今,已经发展到了第二个版本μC/OS II。μC/OS的特点是:公开源码,内核简洁,可移植性好,可裁剪,可固化,抢占式内核,可以管理60多个任务。该系统主要用于教育研究,和一些简单的控制系统应用。
4.2 常用的嵌入式处理器
4.2.1ARM
ARM(Advanced RISC Machines)公司是英国一家CPU核设计商,它本身并不生产CPU,而是设计出CPU以IP核的方式授权给其他公司生产。ARM处理器目前主要包括ARM7,ARM9,ARM10,ARM11以及Cortex 和SecurCore系列。ARM公司推出的嵌入式处理器几乎含盖了所有层次的处理器,主频也从50MHz到1GHz不等。到目前为此,ARM处理器已经成为嵌入式领域的神话,其市场份额高达80%以上,应用范围涉及手机,端终,控制,家电等等。
4.2.2MIPS
MIPS(Microprocessor whithout Interlocked Pipeline Stages)是一种处理器内核标准,它由MIPS技术公司开发拟定的。MIPS技术公司是一家设计制造高性能、高档次的嵌入式32位和64位处理器开发商,在RISC处理器领域占有很重要的地位。2000年,MIPS公司发布了针对MIPS 32 4 Kc的新版本以及未来64位MIPS 64 20 Kc处理器内核。
MIPS技术公司既开发MIPS处理器构架,又自己生产基于MIPS的32/64位处理器芯片。为了使用户更加方便地应用MIPS处理器,MIPS公司推出了一套集成开发工具,称为MIPS IDF(Integrated Development Framework),大大的降低了开发的难度。
4.2.3PowerPC
Power PC构架的主要特点是可伸缩性好,方便灵活。Power PC处理器品种很多,既有通用的处理器,又有嵌入式控制器和内核,应用范围非常广泛,从高端的工作站、服务器到个人PC,从消费类电子产品到大型通信设备等各个方面。
目前Power PC独立微处理器与嵌入式处理器的主频从25MHz~700MHz之间,它们的功耗,尺寸,价格相差比较大,主要的产品模块有Power PC 750 CX和 750 CXe,以及Power PC 440GP,用于嵌入式系统的有Power PC405和Power PC 440。Power PC的嵌入式处理器常用于通信,金融和其他终端设备。
5 ARM处理器
5.1 ARM构架特点
5.1.1ARM的特点
ARM主要特点:体积小、低功耗、低成本、高性能。
支持16位Thumb和32位ARM指令,Thumb指令可以减少大约30%~40%的代码大小,具有更高的代码密度,大量使用寄存器,指令运行速度更快,ARM共有37个32位寄存器,被分为若干组,其中:
-31个通用寄存器,包括程序计数器(PC)
-6个状态寄存器,用以标志CPU的工作状态和运行状态等
大多数的数据操作都在寄存器中完成,寻址方式灵活简单,执行效率高指令长度固定Load/Store加载/存储指令实批量数据传输,大大的提高了执行效率。
5.1.3ARM的状态
ARM具有两种不同的工作状态:ARM状态和THUMB状态,通常,ARM在上电默认是ARM状态,如要切换到THUMB状态,常用的方法是使用BX跳转指令。特别注意的是,在所有的异常模式中,都必须是在ARM状态下实现的,这是ARM固有的特点,不需要用户的干涉。
5.1.4ARM寄存器映射
ARM拥有多达37个寄存器,这些寄存器在不同的模式下不尽相同。对于一些时间要求比较严谨的场合,需要系统作出相当快的响应以确保安全,这时候,往往要立即执行紧急事件,通常的解决方法是使用Fiq(快中断),以保证响应时间。怎么让事件更快速的响应呢?方法就是减少现场保护的时间,ARM的Fiq设计不需要进行现场保护,因为在Fiq模式下,它拥有独立的寄存器,不会影响中断前的任何寄存器状态,从而大大的加快了响应速度。这也是ARM寄存器多的原因之一。同样的道理,在其他相应的模式下,它们对应的寄存数目也是有其特殊意义的。
ARM寄存器映射如图 5.1 ARM寄存器映射所示:
图 5.1 ARM寄存器映射
5.1.5ARM寻址方式
为了提高代码的执行效率,ARM提供了多种寻址方式,一方面,可以减少代码的编写量,另一方面提高了代码密度。尤其是ARM的多寄存器寻址和条件执行的特点,使得程序变得更加优化。
S3C2410 ARM处理器支持大小端模式存储字数据,其寻址空间可达1GB,每个Bank最大支持128MB的存储器,对于外部I/O设备的数据宽度,可以是8,16,32位,所有的存储器Bank(共有8个)都具有可编程的操作周期,而且支持各种ROM引导方式(Nor/Nand)Flash,EEPROM)。其S3C2410内部结构如图 5.2 S3C2410内部结构框图所示
图 5.2 S3C2410内部结构框图
5.2.2Atmel AT91RM9200
AT91RM9200是Atmel公司的32位RISC ARM9处理器,它是基于ARM920T核的,主频达180MHz,运算速度为200MIPS。内置全功能MMU,支持SDRAM、SRAM、BurstFlash、CF卡、SmartMedia以及NAND Flash,具有高性能、低功耗、低成本、小体积等优点。AT91RM9200微处理器是一个多用途的通用芯片,它内部集成了微处理器和常用的外围组件,具有更高性价比的特点,可以为工控等领域提供优秀的解决方案。
PXA270内部结构如图 5.3 PXA270 内部结构所示:
图 5.3 PXA270 内部结构
5.3 S3C2410硬件设计要点
S3C2410是一款高速嵌入式处理器,由于它内置了很多外设模块,需要用到的模块可能要在外围电路中增加一些芯片。这样一来,加上电源、CPU最小系统以及各个模块,系统变得非常复杂。所以在绘制原理图的时候,要注意模块化的设计,可以避免出错。
5.3.1S3C2410电源设计
电源是系统的心脏,系统的稳定性很大程度上取决于电源的设计,对于S3C2410处理器,合理的电源设计如图 5.4 S3C2410系统电源设计所示:
图 5.4 S3C2410系统电源设计
6 嵌入式Linux开发步骤
6.1 GNU GCC简介
嵌入式Linux下的开发,常常使用交叉编译工具。交叉编译工具通常是GNU的一个开放源码的工具链GCC(GNU Compiler Collection),它是一种面向嵌入式领域、支持多种编程语言、支持多种CPU的交叉编译工具,并且可以网上免费得到(www.gnu.org)。它提供了多种编译优化选项,支持分步编译、支持多种反汇编和多种调试信息格式,目前支持的平台有X86、ARM、StrongARM、PPC、MPC、MIPS等等。
GCC的基本功能如下:
(1)输出预处理后的C/C++源程序(展开头文件和替换宏)
(2)输出C/C++源程序的汇编代码
(3)输出二进制目标文件
(4)生成静态库
(5)生成可执行文件
(6)轮换文件格式
(7)支持C、C++、Fortran、Java
6.2 开发环境的搭建
GCC工具提供了二进制文件和源码文件两种方式进行安装。对于宿主机上没有C编译程序的情况下,应当使用二进制文件安装,这种方式的缺点是大部分的可选项都已经配置好,不能由用户自行调整。而源码文件安装方式则不同,用户可以根据自己的需要加载或去除某些选项,最后得到小而合适编译工具。
6.2.1二进制文件的安装
在全球范围内已经有数百个镜像网点提供FTP或CVS方式下载。对于二进制文件,通常GNU的工作人员针对各种情况编译出不同的安装包,用户可以根据自己的需要下载合适的安装文件。下载完成后,就可以直接进行安装了,下面以gcc-core-2.95.3.tar.gz安装包为例。
$cd /usr/local/src
解压到合适的路径
$tar –xvzf …/gcc-core-2.95.3.tar.gz
最后在PATH环境变量中加入安装路径即可。
在命令行中输入:
$gcc –v
可以测试安装情况。
6.2.2源码文件的安装
嵌入式开发过程中,可能会使用不同的CPU,这样就需要一个针对该CPU的开发环境,因此,常以源码的方式安装交叉工具以支持不同的平台。
源码包安装步骤:
(1)首先,在确保宿主机上的GCC编译程序可用,否则应先在宿主机上安装好GCC。
(2)下载合适的源码包,解压到正确的路径。
(3)进入源码包所在路径,执行configure脚本。也可以先执行configure –help来查看帮助信息。配置过程中有很多选项可供选择,每个选项都有默认值,所以只需要为某些特殊情况的选项指定它的值。
(4)最常用的选项是—prefix,用来指定安装GCC二进制代码的根目录名字。安装完成之后,用来指定安装GCC二进制文件的根目录名字。安装完成后,指定前缀的目录包含所有的GCC可执行文件,而子目录bin、include、info、lib、man和share中含有其他文件。默认的前缀是/usr/local/。要针对ARM处理器编译还要加上–with-cpu=arm最简单的配置如:./configure –prefix=/usr/local/ --with-cpu=arm。
(5)配置完成后,会在目录下生成一个makefile编译文件,然后执行make命令即开始编译了。
(6)编译成功后,再运行make install进行安装。
(7)最后设置环境变量,可以运行arm-linux-gcc进行测试。
6.3 Linux内核配置编译
arm-linux-gcc安装成功后,就可以对Linux内核进行编译或配置了。本系统采用的是linux2.4.18版本的内核,可以使用arm-linux-gcc2.95.3交叉工具进行编译。在内核源码的文件夹中可以看到,内核是一个很庞大的源码包,其程序文件就有上万个,代码达到几百万行,可以说是非常的复杂。
6.4 Linux内核构架详解
Linux内核提供了应用程序可以运行的执行环境。因此,内核必须实现一组服务及相应的接口。应用程序使用这些接口,而且通常不会与硬件资源直接交互。
内核整体结构如图 6.2 内核整体结构所示:
图 6.2 内核整体结构
6.4.1进程和内核模式
CPU既可以运行在用户态,也可以运行在内核态。实际上,一些CPU可以有两种以上的执行状态。
当一个程序在用户态下执行时,它不能直接访问内核数据结构或内核的程序。然而,当应用程序在内核态下运行时,这些限制不再有效。每种CPU模型都为从用户态到内核态的转换提供了特殊的指令,相反,一个程序执行时,大部分时间都处于用户态下,只有需要内核所提供的服务时才切换到内核态。当内核满足了用户程序的请求后,它让程序又回到用户态下。
对于每一个进程来说,它们都是动态的实体,在系统内通常只有有限的生存期。创建、撤消以及同步现有进程的任务都委托给内核中的一组例程来完成。
内核本身并不是一个进程,而是进程管理者。进程/内核模式假定:请求内核服务的进程使用所谓系统调用的特殊编程机制。每个系统调用都 设置了一组识别进程请求的参数,然后执行与硬件相关的CPU指令完成从用户态到内核态的转换。
另外,还有一些特权进程叫作内核线程,它们具有以下特点:
(1)以内核态运行在内核地址空间。
(2)不与用户直接交互,因此不需要终端设备
(3)通常在系统启动时建立,直到系统关闭。
内核的工作不只是处理系统调用。实际上,可以有几种方式激活内核例程:
进程调用系统调用,正在执行进程的CPU发出一个异常信号,异常是一些反常的情况,CPU不得不处理的事件。外围设备向 CPU发出一个中断请求信号以通知一个事件的发生,如一个要求注意的请求、一个善忘的变化或一个I/O操作已经完成等等.每个中断信号都是由内核中的中断处理程序来处理的。因为外围设备与CPU异步操作,因此中断是在不可预知的时间发生的。
内核线程被执行。因为内核纯种运行在内核态,因此必须认为期 相应程序是内核态的一部分。
进程的用户态和内核态之间的转换如图 6.3进程的用户态和内核态之间的转换所示:
图 6.3进程的用户态和内核态之间的转换
6.4.2进程的实现
为了让内核管理进程,每个进程由一个进程描述符表示,这个描述符包含有关进程当前状态的信息。
当内核暂停一个进程的执行时,就把几个相关处理器寄存器的内容保存在进程描述符中,这些寄存器包括:
(1)程序计数器和栈指针寄存器
(2)通用寄存器
(3)浮点寄存器
(4)包含CPU状态信息的处理器状态寄存器
(5)用来跟踪进程对RAM访问的内存管理寄存器
当内核决定恢复执行一个进程时,它用进程描述符中合适的字段来装载CPU寄存器。因为程序计数器中所存的值指向下一条将要执行的指令,所以进程从它停止的地方恢复执行。
6.4.3内核同步机制和临界区
对于一个单CPU的系统而言,实际上只有一个进程能够得到CPU及其他资源而获运行的机会,为了不让所有进程都无秩序的访问某些资源,这就需要对这些进程进行统一的安排和管理,内核的同步机制正是为此设计。例如:如果内核控制路径对某个内核数据结构进行操作时被挂起,那么,其他的内核控制路径就不应当再对该数据结构进行操作,除非它已经被重新设置一致性状态。否则,两个控制路径的交互作用将破坏所存储的信息。简单而言,这也就是对资源访问的一种竞争条件,同时这个资源,则称为临界区。
Linux系统中常用的内核同步机制有:
原子操作:操作必须以单个指令执行,运行期间不能够被中断,且避免其他的CPU访问 同一存储单元。
自旋锁: 当内核控制路路径必须访问共享数据结构或进入临界区时,需要为自己获取一把“锁”。资源正在被访问时是上“锁”的,这时其他想访问资源的进程需要等待,它将会不断的查询资源是否可用,直到资源被释放。
信号量: 类似于自旋锁,但等待资源忙时进入睡眠,直到资源可用才被唤醒。
6.5 Linux设备驱动层
6.5.1设备驱动概述
设备驱动属于内核的一部分,对于一个特定的硬件设备来说,由于不同的设备存在不同的通信协议,它们的数据的存取可能需要不同的方式来实现,所以,对于Linux内核,它是不可能包含所有硬件设备的驱动程序,因此,当用户需要在系统中添加一个新的设备时,可能需要用户自己编写该设备的驱动程序。这样,Linux就可以实现对种类烦多的设备驱动。
由于设备驱动属于内核的一部分,而内核态拥有操作系统的最高权限,驱动程序控制了操作系统与设备之间的交互访问,如果驱动程序发生错误,很可能导致整个系统崩溃。
6.5.2设备驱动的分类
现在发行的Linux内核已经提供了非常完善的驱动程序构架,用户可以通过这些通用的驱动程序接口来实现某一设备的驱动。现有的驱动分类主要有两大类:
(1)字符设备驱动
字符设备和普通文件之间的区别在于:普通文件可以来回读/写,而大多数字符设备仅仅是数据通道,只能顺序的读/写。但是不能完全排除字符设备模拟普通文件读/写过程的可能性。字符设备是Linux最简单的设备,用户可以像访问文件一样访问字符设备,在VFS的作用下,应用程序可以使用标准系统调用打开、读取、写和关闭,和普通文件的操作没有任何区别。
(2)块设备驱动
和字符设备一样,块设备也支持像文件一样的访问。这种为打开的块特殊文件提供正确的文件操作组的机制和字符设备的十分相似。Linux用blkdevs向量表维护已经登记的块设备文件。它像chrdevs一样,使用设备的主设备号作为索引,它的条目也是device_struct数据结构。与字符设备不同的是,块设备进行分为两大类:SCSI和IDE。
无论是字符设备还是块设备,由于内核为各类驱动统一了接口,所以对用户而言,对这些设备的使用和操作并没有多大的区别,这也正是Linux的优点之一。
6.5.3设备驱动重要的数据结构
Linux内核提供了几个比较重要的数据结构,这些结构是所有驱动程序必须用到的,也是驱动程序中最基本的数据结构,它提供了设备的入口函数。
inode数据结构:
说明:inode结构包含了文件系统处理的文件所需要的信息。inode结构保存 了page结构,用于进行设备缓冲,当进行读/写操作时,系统首先检查是否有inode存在,然后检查是否已经获得其缓冲内容,若没有则请求,若已经写,则把被写的页标为“脏”。inode结构如下:
struct inode {
struct list_head i_hash;
struct list_head i_list;
struct list_head i_dentry;
struct list_head i_dirty_buffers;
unsigned long i_ino;
atomic_t i_count;
kdev_t i_dev;
umode_t i_mode;
nlink_t i_nlink;
uid_t i_uid;
gid_t i_gid;
kdev_t i_rdev;
loff_t i_size;
time_t i_atime;
time_t i_mtime;
time_t i_ctime;
unsigned long i_blksize;
unsigned long i_blocks;
unsigned long i_version;
struct semaphore i_sem;
struct semaphore i_zombie;
struct inode_operations *i_op;
struct file_operations *i_fop; /* former ->i_op->default_file_ops */
struct super_block *i_sb;
wait_queue_head_t i_wait;
struct file_lock *i_flock;
struct address_space *i_mapping;
struct address_space i_data;
struct dquot *i_dquot[MAXQUOTAS];
/* These three should probably be a union */
struct pipe_inode_info *i_pipe;
struct block_device *i_bdev;
struct char_device *i_cdev;
unsigned long i_dnotify_mask; /* Directory notify events */
struct dnotify_struct *i_dnotify; /* for directory notifications */
unsigned long i_state;
unsigned int i_flags;
unsigned char i_sock;
atomic_t i_writecount;
unsigned int i_attr_flags;
__u32 i_generation;
union {
struct minix_inode_info minix_i;
struct ext2_inode_info ext2_i;
struct hpfs_inode_info hpfs_i;
struct ntfs_inode_info ntfs_i;
struct msdos_inode_info msdos_i;
struct umsdos_inode_info umsdos_i;
struct iso_inode_info isofs_i;
struct nfs_inode_info nfs_i;
struct sysv_inode_info sysv_i;
struct affs_inode_info affs_i;
struct ufs_inode_info ufs_i;
struct efs_inode_info efs_i;
struct romfs_inode_info romfs_i;
struct shmem_inode_info shmem_i;
struct coda_inode_info coda_i;
struct smb_inode_info smbfs_i;
struct hfs_inode_info hfs_i;
struct adfs_inode_info adfs_i;
struct qnx4_inode_info qnx4_i;
struct reiserfs_inode_info reiserfs_i;
struct bfs_inode_info bfs_i;
struct udf_inode_info udf_i;
struct ncp_inode_info ncpfs_i;
struct proc_inode_info proc_i;
struct socket socket_i;
struct usbdev_inode_info usbdev_i;
void *generic_ip;
} u;
};
file数据结构:
file结构主要是与文件系统对应的设备驱动程序使用。当然,其他设备驱动程序也可以使用,它提供有关被打开的文件的信息,其定义如下:
struct file {
struct list_head f_list;
struct dentry *f_dentry;
struct vfsmount *f_vfsmnt;
struct file_operations *f_op;
atomic_t f_count;
unsigned int f_flags;
mode_t f_mode;
loff_t f_pos;
unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;
struct fown_struct f_owner;
unsigned int f_uid, f_gid;
int f_error;
unsigned long f_version;
/* needed for tty driver, and maybe others */
void *private_data;
};
6.5.4Linux驱动程序设备号
Linux驱动程序通过设备号来区别不同的设备。设备号由两部分组成:主设备号和次设备号。
主设备号指明对应哪些设备驱动,这种对应关系是固定不变的并作为内核资源的一部分存在。需要注意的是,同一个主设备号可以对应两个不同的设备驱动,一个可以是字符设备,一个可以是块设备。
次设备号区分被一个设备驱动控制下的某个独立的设备。比如,同一个类型的USB设备可以在系统中存在几个,它们通过次设备号加以区分,而设备驱动程序可以只对应一个。使用cat /proc/devices命令可以查看已经存在的驱动设备的主、次设备号。
7 常用的视频编码格式
7.1 常用视频格式
7.1.1AVI格式
AVI是Audio Video Interleave视频音频交织文件格式的英文缩写,它早在微软Win3.1时代就已经开始服役了,所以名声也比较大。它是微软公司开发的一种符合RIFF文件规范的数字音频和视频文件格式。
AVI格式允许视频和音频交织在一起同步播放,这是因为在AVI里音频和视频文件是分开存储的,因此我们可以把一个视频中的图像与另一个或者几个AVI格式视频文件中的声音或图像结合在一起,产生新的AVI视频文件。另外,AVI支持256色和RLE压缩,但压缩并无确定标准,这就要求必须使用相应的解压缩算法对其解压缩后才可以播放。很早版本的AVI仅仅可以使用微软的视窗/视频操作环境VFW(Microsoft Video For Windows),但随着技术的发展,现在它已被大多数操作平台支持。
AVI采用的是帧内压缩的方式,因此,每一帧图像之间没有必然的关联,也因此方便了后期的画面剪辑可以精确到帧。此外,当设置AVI为不压缩时,采集到的原始视频图像质量高,色彩还原到位。所以,现在很多人都把这种格式的视频文件当作原始视频资料,方便后期的编辑和格式转换。
总结AVI的优点,是兼容性好、质量高、易于编辑;缺点在于体积大,压缩没有固定的标准。
7.1.2 ASF格式
ASF(Advanced Streaming Format高级流格式)是一个在互联网上实时传播视频文件的技术标准。它是由微软公司于近期研制开发的,主要目的在于利用它高兼容性、高画质的优势替代Quick Time等格式标准,以和RM格式相抗衡。ASF也是利用了MPEG-4的压缩算法,所以压缩率和画面质量都是很不错的,足以媲美RM。
ASF应用的核心部件是NetShow服务器和NetShow播放器。它有独立的编码器将媒体信息编译成ASF流,然后发送到NetShow服务器,再由NetShow服务器将ASF流发送给网络上的所有NetShow播放器,从而实现单路广播或多路广播,这其实和Real系统的实时转播大同小异。
微软将ASF 定义为同步媒体的统一容器文件格式。ASF是一种数据格式,音频、视频、图像以及控制命令脚本等多媒体信息通过这种格式,以网络数据包的形式传输,实现流式多媒体内容发布。
ASF最大优点就是体积小,因此适合网络传输,使用微软公司的最新媒体播放器(Microsoft Windows Media Player)可以直接播放该格式的文件。用户可以将图形、声音和动画数据组合成一个ASF格式的文件,当然也可以将其他格式的视频和音频转换为ASF格式,而且用户还可以通过声卡和视频捕获卡将诸如麦克风、录像机等等外设的数据保存为ASF格式。另外,ASF格式的视频中可以带有命令代码,用户指定在到达视频或音频的某个时间后触发某个事件或操作。
7.1.3RM(Real Media)格式
RM格式是Real networks公司开发的常用流式视频文件格式。这类文件可以实现在网络上的即时播放,也符合流文件的鲜明特点。Real Media是目前Internet上最流行的跨平台客户/服务器结构多媒体应用标准,它采用音频/视频流和同步回放技术,实现了网上全带宽的多媒体回放。
符合Real Media规范的主要包括以下3类文件:RealAudio(用来传输接近CD音质的音频数据)、Real Video(用来传输连续的视频数据)和Real Flash(Real Networks公司与Macromedia公司合作推出的新一代高压缩比动画播放格式)。播放RM格式视频文件的工具是Real Player播放器。
7.1.4MPEG格式
MPEG是英文Motion Picture Experts Group(活动图像专家组)的缩写。它有一个很庞大的家族,也是我们现在可以见到的最普通的视频文件格式之一,其中包括MPEG-1、MPEG-2以及MPEG-4。另外,以MPEG为根基派生出的文件格式也很多,主要有mpa、mpe、mpg和mp2等等。
MPEG-1主要被应用于VCD的制作方面,几乎所有的VCD都是由它压缩而成的。不信,你可以打开任何一张存有文件的VCD光盘的根目录,可以发现有许多*.dat格式的文件,这就是MPEG-1文件格式的标志。由于MPEG文件格式采用的是帧内压缩和帧间压缩的有损编码方式,因此,在帧间压缩的地方,前后帧是相互联系的。这就不同于AVI的剪辑技术了,它不能在剪辑的时候精确到每一帧,所以,经常会在剪辑点出现不连贯的马赛克现象。
MPEG-2主要应用于DVD的制作(带有*.vob格式的文件)。同时,也可以在HDTV(高清晰度电视播放)领域里见到它的踪迹,而MPEG-4更多的是应用于网络视频的传输。
严格地说,MPEG-3应该是音频文件格式,不过它也属于MPEG家族。时下很流行的MP3(MPEG Layer 3)音频文件就是MPEG音频应用的一个典型实例。
7.2 ASF格式特点
7.2.1可扩展的媒体类型
ASF文件允许制作者很容易地定义新的媒体类型。ASF格式提供了非常有效的灵活地定义符合ASF文件格式定义的新的媒体流类型。任一存储的媒体流逻辑上都是独立于其他媒体流的,除非在文件头部分明显地定义了其与另一媒体流的关系。
7.2.2部件下载
特定的有关播放部件的信息(如,解压缩算法和播放器)能够存储在ASF 文件头部分,这些信息能够为客户机用来找到合适的所需的播放部件的版本—如果它们没有在客户机上安装。
7.2.3可伸缩的媒体类型
ASF是设计用来表示可伸缩的媒体类型的"带宽"之间的依赖关系。ASF存储各个带宽就像一个单独的媒体流。媒体流之间的依赖关系存储在文件头部分,为客户机以一个独立于压缩的方式解释可伸缩的选项提供了丰富的信息流的优先级化- 现代的多媒体传输系统能够动态地调整以适应网络资源紧张的情况(如,带宽不足)。多媒体内容的制作者要能够根据流的优先级表达他们的参考信息,如最低保证音频流的传输。随着可伸缩媒体类型的出现,流的优先级的安排变得复杂起来,因为在制作的时候很难决定各媒体流的顺序。ASF允许内容制作者有效地表达他们的意见(有关媒体的优先级),甚至在可伸缩的媒体类型出现的情况下也可以。
7.2.4多语言
ASF设计为支持多语言。媒体流能够可选地指示所含媒体的语言。这个功能常用于音频和文本流。一个多语言ASF文件指的是包含不同语言版本的同一内容的一系列媒体流,其允许客户机在播放的过程中选择最合适的版本。
7.2.5目录信息
ASF提供可继续扩展的目录信息的功能,该功能的扩展性和灵活性都非常好。所有的目录信息都以无格式编码的形式存储在文件头部分,并且支持多语言,如果需要,目录信息既可预先定义(如,作者和标题),也可以是制作者自定义。目录信息功能既可以用于整个文件也可以用于单个媒体流。
7.3 ASF格式结构
7.3.1ASF 对象定义
ASF文件基本的组织单元叫做ASF 对象,它是由一个128位的全球唯一的对象标识符(Object ID),一个64位整数的对象大小(Object Size)和一个可变长的对象数据(Object Data)组成。对象大小域的值是由对象数据的大小加上24比特之和。 其结构如图 7.1所示。
图 7.1 ASF对象
这个文件组织单元有点类似于RIFF(Resource Interchange File Format)字节片。RIFF字节片时AVI和WAV文件的基本单位。ASF对象在两个方面改进了RIFF的设计。首先,无需一个权威机构来管理对象标识符系统,因为计算机网卡能够产生一个有效的唯一的GUID。其次,对象大小字段已定义得足够处理高带宽多媒体内容的大文件。
7.3.2 高层文件结构
ASF文件逻辑上是由三个高层对象组成:头对象(Header Object)、数据对象(Data Object)和索引对象(Index Object).。头对象是必需的并且必须放在每一个ASF文件的开头部分,数据对象也是必需的,且一般情况下紧跟在头对象之后。索引对象是可选的,但是一般推荐使用,其文件结构如图 7.2所示。
图 7.2高层ASF文件结构
在具体实现过程中可能会出现一些文件包含无序的(Out-Of-Order)的对象,ASF也支持,但在特定情况下,将导致ASF 文件不能使用,如从特定的文件源如HTTP服务器读取该类ASF文件。同样地,额外的高层对象也可能被运用并加入到ASF文件中。一般推荐这些另加的对象跟在索引对象之后。
ASF数据对象能够被解释的一个前提条件是头对象已被客户机接收到。ASF没有声明头对象信息是如何到达客户端的,“到达机制"是一个"本地实现问题”,显然已超过了ASF 的定义范围。头对象先于数据对象到达有三种方式:
包含头对象的信息作为"会话声明"的一部分。
利用一个与数据对象不同的"通道"发送头对象。
在发送ASF 数据对象之前发送头对象。
7.3.3ASF头对象
在ASF的三个高层对象中,头对象是唯一包含其他ASF 对象的对象。头对象可能包含一下对象:
文件属性对象(File Properties Object)----全局文件属性。
流属性对象(Stream Properties Object)----定义一个媒体流和其属性。
内容描述对象(Content Description Object)----包含所有目录信息。
部件下载对象(Component Download Object)----提供播放部件信息。
流组织对象(Stream Groups Object)----逻辑上把多个媒体流组织在一起。
可伸缩对象(Scalable Object)----定义媒体流之间的可伸缩的关系。
优先级对象(Prioritization Object)----定义相关流的优先级。
相互排斥对象(Mutual Exclusion Object)----定义排斥关系如语言选择。
媒体相互依赖对象(Inter-Media Dependency Object)—定义混合媒体流之间的相互依赖关系。
级别对象(Rating Object)----根据W3C PICS定义文件的级别。
索引参数对象(Index Parameters Object)----提供必要的信息以重建ASF文件的索引。
图 7.3 ASF 头对象
如图 7.3所示,头对象的作用是在ASF文件的开始部分提供一个众所周知的比特序列,并且包含所有其它头对象信息。头对象提供了存储在数据对象中的多媒体数据的全局的信息。
7.3.4ASF数据对象
数据对象包含一个ASF 文件的所有多媒体数据。多媒体数据以ASF数据单元的形式存储,每一个ASF数据单元都是可变长的,且包含的数据必须是同一种媒体流。数据单元在当它们开始传输的时候在数据对象中自动地排序,这种排序来自于交叉存储的文件格式。
7.3.5ASF索引对象
ASF索引对象包含一个嵌入ASF文件的多媒体数据的基于时间的索引。每以索引进入表现的时间间隔是在制作时设置的,并且存储在索引对象中。由于没有必要为一个文件的每一个媒体流建立一个索引,因此,通常利用一个时间间隔列表来索引一系列的媒体流。
8 ffmpeg 视频CODEC库
8.1 ffmpeg简介
ffmpeg是一个免费开源的视频、音频编解码库。目前支持asf、MPEG、FLV、AVI等多种格式,并且可以在多种平台下编译运行,常用于流媒体、视频服务站、视频会议等领域。
8.2 ffmpeg移植要点
要把ffmpeg移植到ARM平台,需要进行相关的修改和配置。首先,arm-linux-gcc2.95.3与视频相关的videodev.h头文件和ffmpeg0.4.8不兼容,需要把Red Hat 9.0的gcc下的videodev.h拷贝到arm-linux-gcc …/2.95.3/arm-linux/include/linux/目录下,并替换掉原来的videodev.h头文件。同时,为了保证编译器版本的兼容性,也要把Red Hat 9.0的gcc下的version.h拷贝到arm-linux-gcc …/2.95.3/arm-linux/include/linux/目录下。此外,如果ARM平台中的视频设备文件名为video0,还需要把grab.c中的/dev/video"改为"/dev/video0",以保证在ARM平台上程序能够正确的找到视频设备。
修改完毕,就可以进行配置了,配置命令如下:
./configure --cross-prefix=arm-linux- --cpu=armv4l --disable-mmx --enable-v4l --enable-ffserver --enable-ffplay --disable-small --disable-risky
–cross-prefix=arm-linux-是设置交叉编译器的前缀的,我们用的交叉编译器是arm-linux-gcc,所以它的前缀应该是arm-linux-。
–cpu=armv4l是用于编译时采用ARM汇编进行代码优化,可以很大程度上改善运行的效果。
–enable-v4l 即使能linux操作系统下的v4l技术,在视频处理中是必须用到的。
–enable-ffserver 使能编译ffserver,ffserver是和ffmpeg源码包一起的一个http服务器,具体在后面会有更详细的说明。
–disable-small优化代码的运行速度,不优化其尺寸,这是根据ARM处理器运算速度低的特点而采取的一种提高处理能力的方法。
配置完毕,就可以使用make命令进行编译了,如果没有出错,最后编译出来的可执行文件为ffmpeg和ffserver,同时还有范例可执行文件output_example。
8.3 ffmpeg常用命令
Standard options: 基本选项参数
–help 显示此帮助信息|print this message
–log[=FILE|yes|no] 记录测试并输出到config.err文件|log tests and output to FILE [config.err]
–prefix=PREFIX 安装程序到指定目录(默认/usr/local)|install in PREFIX [/usr/local]
–libdir=DIR 安装库到指定目录(默认prefix/lib)|install libs in DIR [PREFIX/lib]
–shlibdir=DIR 指定共享库路径(默认prefix/lib)|install shared libs in DIR [PREFIX/lib]
–incdir=DIR 指定includes路径(默认prefix/include/ffmpeg)|install includes in DIR[PREFIX/include/ffmpeg]
–mandir=DIR 指定man page路径(默认prefix/man)install man page in DIR [PREFIX/man]
–enable-mp3lame 启用mp3编码libmp3lame(默认关闭)enable MP3 encoding via libmp3lame[default=no]
–enable-libogg 启用ogg支持libogg(默认关闭)enable Ogg support via libogg [default=no]
–enable-vorbis 启用Vorbis支持libvorbis(默认关闭)enable Vorbis support via libvorbis [default=no]
–enable-faad 启用faad支持libfaad(默认关闭)enable FAAD support via libfaad [default=no]
–enable-faadbin 启用faad运行时链接支持(默认关闭)build FAAD support with runtime linking[default=no]
–enable-faac 启用faac支持libfaac(默认关闭)enable FAAC support via libfaac [default=no]
–enable-libgsm 启用GSM支持libgsm(默认关闭)enable GSM support via libgsm [default=no]
–enable-xvid 启用xvid支持xvidcore(默认关闭)enable XviD support via xvidcore [default=no]
–enable-x264 启用H.264编码(默认关闭)enable H.264 encoding via x264 [default=no]
–enable-mingw32 启用MinGW本地/交叉win环境编译|enable MinGW native/cross Windows compile
–enable-mingwce 启用MinGW本地/交叉winCE环境编译enable MinGW native/cross WinCE compile
–enable-a52 启用A52支持(默认关闭)enable GPLed A52 support [default=no]
–enable-a52bin 启用运行时打开liba52.so.0(默认关闭)open liba52.so.0 at runtime [default=no]
–enable-dts 启用DTS支持(默认关闭)enable GPLed DTS support [default=no]
–enable-pp 启用后加工支持(默认关闭)enable GPLed postprocessing support [default=no]
–enable-static 构建静态库(默认启用)build static libraries [default=yes]
–disable-static 禁止构建静态库(默认关闭)do not build static libraries [default=no]
–enable-shared 构建共享库(默认关闭)build shared libraries [default=no]
–disable-shared 禁止构建共享库(默认启用)do not build shared libraries [default=yes]
–enable-amr_nb 启用amr_nb float音频编解码器|enable amr_nb float audio codec
–enable-amr_nb-fixed 启用fixed amr_nb codec | use fixed point for amr-nb codec
–enable-amr_wb 启用amr_wb float音频编解码器|enable amr_wb float audio codec
–enable-amr_if2 启用amr_wb IF2音频编解码器|enable amr_wb IF2 audio codec
–enable-sunmlib 启用Sun medialib(默认关闭) | use Sun medialib [default=no]
–enable-pthreads 启用pthreads(多线程)(默认关闭)use pthreads [default=no]
–enable-dc1394 启用libdc1394、libraw1394抓取IIDC-1394(默认关闭)enable IIDC-1394 grabbing using libdc1394 and libraw1394 [default=no]
–enable-swscaler 启用计数器支持?(默认关闭)software scaler support [default=no]
–enable-avisynth 允许读取AVISynth脚本本件(默认关闭)allow reading AVISynth s cript files [default=no]
–enable-gpl 允许使用GPL(默认关闭)allow use of GPL code, the resulting libav* and ffmpeg will be under GPL [default=no]
Advanced options (experts only):高级选项参数(供专业人员使用)
–source-path=PATH 源码的路径(当前为/root/flv/ffmpeg)| path to source code [/root/flv/ffmpeg]
–cross-prefix=PREFIX 为编译工具指定路径 | use PREFIX for compilation tools []
–cross-compile 假定使用了交叉编译 | assume a cross-compiler is used
–cc=CC 指定使用何种C编译器(默认gcc)use C compiler CC [gcc]
–make=MAKE 使用特定的make | use specified make [make]
–extra-cflags=ECFLAGS 添加ECFLAGS到CFLAGS | add ECFLAGS to CFLAGS []
–extra-ldflags=ELDFLAGS 添加ELDFLAGS到LDFLAGS(默认-Wl,–as-needed)| add ELDFLAGS to LDFLAGS [ -Wl,–as-needed]
–extra-libs=ELIBS 添加ELIBS | add ELIBS []
–build-suffix=SUFFIX 为专用程序添加后缀 | suffix for application specific build []
–arch=ARCH 选择机器架构(默认x86)select architecture [x86]
–cpu=CPU 选用最低的cpu(影响指令的选择,可以在老CPU上出错) | selects the minimum cpu required (affects instruction selection, may crash on older CPUs)
–powerpc-perf-enable 启用PPC上面的性能报告(需要启用PMC)enable performance report on PPC
(requires enabling PMC)
–disable-mmx 禁用MMX | disable MMX usage
–disable-armv5te 禁用armv5te | disable armv5te usage
–disable-iwmmxt 禁用iwmmxt | disable iwmmxt usage
–disable-altivec 禁用AltiVec | disable AltiVec usage
–disable-audio-oss 禁用OSS音频支持(默认启用)disable OSS audio support [default=no]
–disable-audio-beos 禁用BeOS音频支持(默认启用)disable BeOS audio support [default=no]
–disable-v4l 禁用video4linux提取(默认启用)disable video4linux grabbing [default=no]
–disable-v4l2 禁用video4linux2提取(默认启用)disable video4linux2 grabbing [default=no]
–disable-bktr 禁用bktr视频提取(默认启用)disable bktr video grabbing [default=no]
–disable-dv1394 禁用DV1394提取(默认启用)disable DV1394 grabbing [default=no]
–disable-network 禁用网络支持(默认支持)disable network support [default=no]
–disable-ipv6 禁用ipv6支持(默认支持)disable ipv6 support [default=no]
–disable-zlib 禁用zlib(默认支持)disable zlib [default=no]
–disable-simple_idct 禁用simple IDCT例程(默认启用)disable simple IDCT routines [default=no]
–disable-vhook 禁用video hooking支持 | disable video hooking support
–enable-gprof enable profiling with gprof [no]
–disable-debug 禁用调试符号 | disable debugging symbols
–disable-opts 禁用编译器最优化 | disable compiler optimizations
–disable-mpegaudio-hp 启用更快的解码MPEG音频(但精确度较低)(默认禁用)faster (but less accurate) MPEG audio decoding [default=no]
–disable-protocols 禁用 I/O 协议支持(默认启用)disable I/O protocols support [default=no]
–disable-ffserver 禁用生成ffserver | disable ffserver build
–disable-ffplay 禁用生成ffplay | disable ffplay build
–enable-small 启用优化文件尺寸大小(牺牲速度)optimize for size instead of speed
–enable-memalign-hack 启用模拟内存排列,由内存调试器干涉? | emulate memalign, interferes with memory debuggers
–disable-strip 禁用剥离可执行程序和共享库 | disable stripping of executables and shared libraries
–disable-encoder=NAME 禁用XX编码器 | disables encoder NAME
–enable-encoder=NAME 启用XX编码器 | enables encoder NAME
–disable-decoder=NAME 禁用XX解码器 | disables decoder NAME
–enable-decoder=NAME 启用XX解码器 | enables decoder NAME
–disable-encoders 禁用所有编码器 | disables all encoders
–disable-decoders 禁用所有解码器 | disables all decoders
–disable-muxer=NAME 禁用XX混音器 | disables muxer NAME
–enable-muxer=NAME 启用XX混音器 | enables muxer NAME
–disable-muxers 禁用所有混音器 | disables all muxers
–disable-demuxer=NAME 禁用XX解轨器 | disables demuxer NAME
–enable-demuxer=NAME 启用XX解轨器 | enables demuxer NAME
–disable-demuxers 禁用所有解轨器 | disables all demuxers
–enable-parser=NAME 启用XX剖析器 | enables parser NAME
–disable-parser=NAME 禁用XX剖析器 | disables parser NAME
–disable-parsers 禁用所有剖析器 | disables all parsers
9 ffserver视频服务器
9.1 ffserver简介
FFserver是一个音频视频流服务器,它支持几种实时流,来自文件和随时间移动的实时流(你可以在实时流中移动指针,只要你在ffserver.conf文件配置中提供足够大的流缓冲)。FFserver采用标准socket网络编程,所以可以进行跨平台移植。
9.2 ffserver移植要点
ffserver也和ffmpeg一样使用到libavcodec,libavformat库,因此前面的修改和编译是一样的。
9.3 ffserver配置和使用详解
ffserver能识别.conf文件,以ffserver.conf配置文件为例,它提供了http服务器的一些相关设置信息。下面对这些主要信息进行说明:
Port 8090 端口号
BindAddress 0.0.0.0 绑定IP地址,0.0.0.0表示不绑定
MaxClients 1000 最大的客服端数量
MaxBandwidth 1000 最大的带宽
10 系统测试
10.1 ffmpeg测试
10.1.1查看支持的格式
运行./ffmpeg –formats可以查看所编译的ffmpeg支持哪些音频、视频文件,执行后会在终端上显示出相关信息(见图8.1)。
图8.1 ./ffmpeg –formats截图
从截图可以看出,所编译的ffmpeg已经支持数十种音频、视频文件,完全可以满足各种音频、视频应用。
10.1.2从视频文件中截图
ffmpeg源码包目录下有个test目录,里面有一个视频文件a-mpeg1.mpg。我们可以通过命令:./ffmpeg –I a-mpeg1.mpg lena.%d.jpg把a-mpeg1.mpg视频文件中的所而帧图像分解出来,分解后共得到了48帧图片,即这个视频文件由这48帧图像组成的。以下是运行命令后显示出来的信息(见图8.2),其中包括了视频文件的尺寸,帧率,码率,格式等等。
图8.2 从视频文件截图
以下是输出其中的一帧图像信息,如图 10.1所示
图 10.1 单帧图像信息
10.1.3用摄像头录像
使用摄像头录像可以使用命令:./ffmpeg –vd /dev/video0 –an output.mpg,其中参数-vd表示video device,后面跟视频设备的绝对路径。参数-an表示不录制声音,输出文件是output.mpg,ffmpeg可以根据后缀名来确定输出视频格式,这里是mpeg格式。执行命令后的截图如下:
图8.4 ffmpeg摄像头录像命令
从控制台终端的输出结果显示,摄像头相关属性有:视频尺寸160x128,格式yuv420p原始图像格式,帧率25fps,码率200kb/s。编码后的输出相关属性有:视频尺寸160x128,格式mpeg,码率257.6kbps。摄像头录像的截图如图 10.2所示:
图 10.2 摄像头录像截图
10.2.2载入摄像头视频流
ffserver启动后,就可以把视频流数据载入到缓冲文件feed1.ffm中,方法很简单,只要执行命令:./ffmpeg http://localhost:8090/feed1.ffm ,执行命令后终端显示信息如图 10.3所示:
图 10.3 载入视频流数据
10.2.3启动Windows Media Player进行远程监控
当用Windows Media Player打开URL地址http://192.168.0.94:8090/test.asx时,ffserver会监听到8090端口有主机访问,然后就会把采集到的图像数据传送给该主机,即实现服务器和客服端的通信。当ffserver监听到8090端口有访问时,终端会作如下的记录(见图8.6):
图8.7 网络监听到客服端口访问
这时,Windows Media Player就会显示摄像头的图像数据,由于S3C2410运算速度的问题,图像传输延迟在所难免。图 10.4是通过网络监控系统拍摄到的图片的缩截图。
图 10.4网络监控系统拍摄
10.3 测试注意事项
在测试过程中,需要注意一些细节事项,以保证测试顺利进行。
ffmpeg测试的进程中,应先熟悉其可用参数,可以执行./ffmpeg –help来查看更多的可用选项。
ffserver测试时需要注意的是,要事先确保ffserver.conf配置文件的准确性,除了语法上不能表达错误之外,还要保证参数的正确,如:输出尺寸不能是任意的,应该是一些标准的尺寸,如160x128,320x240等等,其他如100x90,300x200都是错误的。
在进行网络监控测试时,要注意ffserver和ffmpeg启动的先后顺序,前者要先启动。此外,该实验是在局域目前网内进行的,服务器要和客服端处于同一个网段,即IP地址的前三个字节要相同,否则无法收到图像数据。
11 总结
经过两个多月的毕业设计,自己学习到很多东西。以前,学习嵌入式系统时,一直局限于理论,分析Linux内核原理,现在真正应用到实践当中才发现,理论固然重要,但也要根据实际的情况对问题进行分析才能最终找到答案。我感到很庆幸,06年初的时候就开始了嵌入式Linux的研究,虽然一直以来,受到的挫折很多,也曾经遇到过信心严重受打击的情况,但我没有放弃,一直坚持了下来。直到今天我才发现,以前的执着是对的,没有以前的努力,我不可能如此快的完成我的毕业设计。在经历了各种各样的比赛后,毕业设计将成为我在大学期间最后一次非商业化技术研究,在企业真正的实习后才发现,以前所做的一些作品和真正商业化的产品真的不可同日而语。商业化的产品必须要通过严格的测试,EMC、RoHS等等各种各样的认证和测试是必不可少的环节,这些也正是我以后所需要学习的,也算是我将步入社会工作的学习计划吧。