数字视频监控系统客户端设计+源代码+绪论 第4页
、图1-2 通用设备管理类图所有的设备类型都将继承于Device这个根类型,Device类派生出RootDevice类和SubDevice类。RootDeivce类是现实设备的一个抽象,RootDevice类的所有子类对应现实的一类具体设备,实现对这类设备的支持,RootDevice类的子类的实例对应一台本地或远程的设备。如图中的dm365Dvr,就是一类使用TI dm365 SoC的并支持UD works的视频协议的DVR设备,内部的命名为 DM365DVR-1。而fh35Dvr则是一个计划中产品,将会在以后的版本中提供支持。SubDevice类是对现实设备的一部分功能的抽象,与RootDevice类的根本区别在于SubDevice类并不对应一个具体的设备。SubDevice类可能只是对应RootDevice类的一部分功能,而RootDevice类实例可能会包含多个SubDevice类实力。如上图中的dm365Camera类,所抽象的是一个视频摄像机,对应了一个视频数据流的处理流程。而一个DM365DVR-1设备可以同时处理4个或8个视频数据流,所以dm365Dvr类实例可能包含4或8个dm365Camera实例,而dm365Dvr具备本地的存储功能,所以dm365Dvr的实例将会包含一个LocalStorage类的实例3 Gstreamer基本概念
3.1 元素和插件
元件是GStreamer的核心。在插件的开发中,一个元件就是继承于 GstElement的一个对象。元件在与其他元件连接时提供了如下一些功能 :例如,一个源元件为一个流提供数据,一个滤镜元件对流中的数据进行操作。没有了元件,GStreamer只是一堆概念性的管道,没有任何东西可供连接 。GStreamer已经自带了一大堆元件,但是我们仍然可以编写额外的元件。
然而,仅仅写一个新的元件并不够,为了使GStreamer能够使用它,你必须将元件封装到一个插件中。一个插件是一块可以加载的代码,通常被称为共享对象文件(shared object file)或动态链接库(dynamically linked library)。一个插件中可以包含一个或若干元件。为简单起见,本手册主要涉及只包含一个元件的插件。
滤镜是一类处理流数据的重要插件。数据的生产者和消费者分别被称为source和sink元件。 箱柜(Bin)元件可以包含其它的元件。箱柜的主要职责是调度它包含的元件并使得数据流更平滑。热插拔(autoplugger)元件是另一种箱柜,它可以动态的加载其它元件,并将它们连接起了形成一个可以处理两个任意流的滤镜。
GStreamerr充斥着插件的概念,即使你只使用到一些标准的包。核心库中只有少量基本函数,其它所有的功能都由插件来实现。一个XML文件被用来保存所有注册的插件的详细信息。 这样,使用GStreamer的程序可以只在需要时加载插件,而不必事先全部加载。插件也只在需要它们的元件时才被加载。
3.2 箱柜和管道论文网
http://www.751com.cn箱柜(Bins)是一个可以装载元件(element)的容器。管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有元件(element)。因为箱柜(Bins)本身又是元件(element)的子集,所以你能够象操作普通元件(element)一样的操作一个箱柜(Bins), 通过这种方法可以降低你的应用程序的复杂度。你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins)内部所有元件(element)的状态。箱柜(Bins)可以发送总线消息(bus messages)给它的 子集元件(element)(这些消息包括:错误消息(error messages),标签消息(tag messages),EOS消息(EOS messages))。
管道(pipeline)是高级的箱柜(Bins)。当你设定管道的暂停或者播放状态的时候,数据流将开始流动,并且媒体数据处理也开始处理。一旦开始,管道将在一个 单独的线程中运行,直到被停止或者数据流播放完毕
3.3 衬垫
在GStreamer中,衬垫是用来在元件间协商连接和数据流的。衬垫可以看作元件间互相连接的 “接口”,数据流通过这些接口流入流出元件。Pad具有特殊的数据处理能力:衬垫可以限制通过它的数据类型。只有当两个衬垫允许通过的数据类型兼容时才可以将它们连接起来。
也许打一个比方可以有助于理解这些概念。衬垫类似于物理设备上的a plug or jack。想象一个包含功放,DVD播放器和一个视频投影仪器的家庭影院系统。将投影仪和DVD播放器相连是允许的,因为这两个设备具有兼容的video jacks。而要将投影仪和功放连起来也许就行不通了,因为它们之间的jack不同。GStreamer中的衬垫具有和家庭影院系统中的jack相同的功能。
大部分情况下,所有在GStreamer中流经的数据都遵循一个原则。数据从元件的一个或多个源衬垫流出,从一个或多个sink衬垫流入。源和sink元件分别只有源和sink衬垫。
3.4 缓冲本文来自辣-文'论-文~网
缓冲区是一块可以存放各种数据的内存。缓冲区的内存一般用malloc()函数分配。这样虽然很方便,但不总是最高效,因为数据经常需要被显式的拷入缓冲区。
有些特殊的元件创建指向特殊内存的缓冲区。例如,filesrc 元件通常会(使用 mmap())将一个文件映射到应用程序的地址空间,并创建指向那个地址范围的缓冲区。这些由filesrc创建的缓冲区具有和其它通用的缓冲区一样的行为,唯一的区别是它们是只读的。释放缓冲区的代码将自动检测内存类型并使用正确的方法释放内存。
另一种可能得到特殊缓冲区的途径是向下游同伙(downstream peer)发出请求。这样得到的缓冲区称为downstream-allocated缓冲区。元件可以请求一个连接到源衬垫的同伙创建一个指定大小的空缓冲区。如果下游元件可以创建一个正确大小的特殊缓冲区,它将会这样做。否则,GStreamer将会自动创建一个通用缓冲区。接着,请求缓冲区的元件就可以将数据拷入缓冲区,并将缓冲区push给创建它的源衬垫。
许多sink元件的将数据拷到硬件的函数都经过了优化,或者可以直接操作硬件。这些元件为它们的上游伙伴创建downstream-allocated缓冲区是很平常的事。其中一例是ximagesink。它创建包含XImage的缓冲区,因此当一个上游伙伴将数据拷入缓冲区时,数据被直接拷入XImage,这样ximagesink可以直接将图象画到屏幕上而不用先将数据拷到一个 XImage中。
滤镜元件通常有机会可以直接作用于缓冲区,或者在将数据从源缓冲区拷入目标缓冲区时发生作用。最佳方案是两种算法都予以实现,因为GStreamer框架会在可能的时候选择最快的算法。自然地,这只在元件的源和sink衬垫完全一致的情况下才有效果
上一页 [1] [2] [3] [4] [5] [6] 下一页
数字视频监控系统客户端设计+源代码+绪论 第4页下载如图片无法显示或论文不完整,请联系qq752018766