基于GStreamer的Smooth Streaming插件开发
2.箱柜和管道
箱柜(Bins)是一个可以装载元件的容器。管道(pipelines)是箱柜的一个特殊的子类型,管道可以操作包含在它自身内部的所有元件。因为箱柜本身又是元件的子集,所以你能够象操作普通元件一样的操作一个箱柜, 通过这种方法可以降低你的应用程序的复杂度。你可以改变一个箱柜的状态来改变箱柜内部所有元件的状态。箱柜可以发送总线消息给它的子集元件(这些消息包括:错误消息,标签消息,EOS消息)。图2-6为形象化的箱柜:
图2-6 箱柜的结构图
管道是高级的箱柜。当你设定管道的暂停或者播放状态的时候,数据流将开始流动,并且媒体数据处理也开始处理。一旦开始,管道将在一个单独的线程中运行,直到被停止或者数据流播放完毕。
3.衬垫
衬垫(Pads)是元件对外的接口。源元件只有一个源衬垫,过滤元件有一个接收衬垫和若干源衬垫,接收衬垫中也只有一个接收衬垫。数据流从一个元件的源衬垫(source pad)到另一个元件的接收衬垫(sink pad)。衬垫的功能(capabilities)决定了一个元件所能处理的媒体类型。
一个衬垫的类型由2个特性决定:它的数据导向性以及它的时效性。GStreamer定义了衬垫的两种数据导向性:源衬垫和接收衬垫。其中源衬垫是负责发送数据,而接收衬垫是用来接收数据的。如上图的箱柜的数据流动为:首先,通过源元件获得数据并从源衬垫流出;然后,经过过滤元件的接收衬垫接收数据,并处理该数据通过源衬垫将数据传出;最后,接收元件通过接收衬垫接收有过滤元件传出的数据,最终将数据注入到底层视频和音频接口中。
衬垫的时效性比衬垫的数据导向复杂得多。一个衬垫可以拥有三种类型的时效性: 永久型(always)、随机型(sometimes)、请求型(on request)。三种时效
7
基于GStreamer的Smooth Streaming插件开发
性的意义顾名思义: 永久型的衬垫一直会存在,随机型的衬垫只在某种特定的条件下才存在(会随机消失的衬垫也属于随机型),请求型的衬垫只在应用程序明确发出请求时才出现。
4.事件和缓冲区
管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号,所有这些数据流在运行的时候自动的流过管道。
⑴缓冲区。缓冲区包含了所创建的管道里的数据流。通常一个源元件会创建一个新的缓冲区,同时元件还将会把缓冲区的数据传递给下一个元件。当使用GStreamer底层构造来创建一个媒体管道的时候,你不需要自己来处理缓冲区,元件将会为你处理这些缓冲区。一个缓冲区主要由以下几个部分组成:指向某块内存的指针、内存的大小、缓冲区的时间戳和一个引用计数。
⑵事件。事件是一系列控制粒子,随着缓冲区被发送到管道的上游和下游。下游事件通知流状态相同的元件,可能的事件包括中断,flush,流的终止信号等等。在应用程序与元件之间的交互以及事件与事件之间的交互中,上游事件被用于改变管道中数据流的状态,如查找。对于应用程序来说,上游事件非常重要,下游事件则是为了说明获取更加完善的数据概念上的图像。
5.总线
总线是一个简单的系统,它采用自己的线程机制将一个管道线程的消息分发到一个应用程序当中。总线的优势是: 当使用 GStreamer 的时候,应用程序不需要线程识别,即便 GStreamer已经被加载了多个线程。
每一个管道默认包含一个总线,所以应用程序不需要再创建总线。应用程序只需要在总线上设置一个类似于对象的信号处理器的消息处理器。当主循环运行时,总线将会轮询这个消息处理器是否有新的消息,当消息被采集到后,总线将呼叫相应的回调函数来完成任务。
8
基于GStreamer的Smooth Streaming插件开发
2.2 H.264视频编解码技术 2.2.1 H.264视频编解码技术简介
MPEG(Moving Picture Experts Group)和VCEG(Video Coding Experts Group)已经联合开发了一个比早期研发的MPEG 和H.263 性能更好的视频压缩编码标准,这就是被命名为AVC(Advanced Video Coding),也被称为ITU-T H.264 建议和MPEG-4 的第10 部分的标准,简称为H.264/AVC 或H.264。这个国际标准已经与2003年3月正式被ITU-T 所通过并在国际上正式颁布。为适应高清视频压缩的需求,2004 年又增加了FRExt部分;为适应不同码率及质量的需求,2006 年又增加了可伸缩编码 SVC。
一个编码图像通常划分成若干宏块组成,一个宏块由一个16x16亮度像素和附加一个8x8 Cb和一个8x8 Cr彩色像素块组成。每个图象中,若干宏块被排列成片的形式。
I片只包含I宏块,P片可包含P和I宏块,而B片可包含B和I宏块。其中:I宏块利用从当前片中已解码的像素作为参考进行帧内预测(不能取其它片中的已解码像素作为参考进行帧内预测)。P宏块利用前面已编码图象作为参考图象进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割:即16x16、16x8、8x16或8x8亮度像素块(以及附带的彩色像素);如果选了8x8的子宏块,则可再分成各种子宏块的分割,其尺寸为8x8、8x4、或4×4亮度像素块(以及附带的彩色像素)。B宏块则利用双向的参考图象(当前和未来的已编码图象帧)进行帧内预测。
H.264规定了三种档次,其档次结构图如图2-7所示:
9
基于GStreamer的Smooth Streaming插件开发
图2-7 H.264档次结构图
基本档次:利用I片和P片支持帧内和帧间编码,支持利用基于上下文的自适应的变长编码进行的熵编码CAVLC。主要用于可视电话、会议电视、无线通信等实时视频通信。
主要档次:支持隔行视频,采用B片的帧间编码和采用加权预测的帧内编码;支持利用基于上下文的自适应的算术编码CABAC。主要用于数字广播电视与数字视频存储。
扩展档次:不支持交错视频和CABAC。但增加了一些在进行比特流切换时有效的帧模式SI(Switching I)帧和SP(Switching P)帧。能够有效的提高从错误中恢复的能力,它的主要应用是流媒体应用。
2.2.2 H.264的分层结构
H.264的目标应用涵盖了目前大部分的视频服务,如有线电视、远程监控、交互媒体、数字电视、视频会议、视频点播、流媒体服务。
为了使H.264能适用于这些不同的网络结构,H.264标准由视频编码层(VCL)和网络提取层NAL)组成,组成结构见图2-8所示:
10
基于GStreamer的Smooth Streaming插件开发
图2-8 H.264层次图
VCL层包括VCL编码器和VCL解码器,主要功能是视频数据压缩编码和解码。VCL可以传输按当前的网络情况调整的编码参数。
NAL层则用于为VCL提供一个与网络无关的统一接口,它负责对视频数据进行封装打包后使其在网络中传送,采用统一的格式,包括单个字节的包头信息,一个原始字节序列负荷RBSP(多个字节的视频数据与组帧、逻辑信道信令、定时信息、序列结束信号等)。包头中包含存储标志和类型标志。存储标志用于指示当前数据不属于被参考的帧。类型标志用于指示图像数据类型。NAL是根据具体的网络传输环境把压缩的数据进行传输封装。NAL单元序列如图2-9所示:
图2-9 NAL单元序列结构图
2.3 AAC音频编解码技术 2.3.1 AAC音频编码基本概念
先进音频编码(Advanced Audio Coding——AAC)是继MPEG-2 音频标准(ISO/IEC 13818-3)之后的新一代音频压缩标准,事实上,AAC即为原来所称的后向不兼容编码标准——NBC(Non-Backward Compatible)。该标准主要是在原MPEG-2 层II、杜比实验室的Dolby AC-3 及MPEG-1 层III 等的音频压缩算法的基础上发展起来的。其主要目的就是在于对MPEG-2 层II 的码率要求进行
11