C#开发多媒体播放器.doc_第1页
C#开发多媒体播放器.doc_第2页
C#开发多媒体播放器.doc_第3页
C#开发多媒体播放器.doc_第4页
C#开发多媒体播放器.doc_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

第一章 绪 论1.1 为什么使用C#在学校学习过C+和JAVA,而这次毕业设计我却选用了C#。我的理由是C#简单而强大,而.net2003操作又非常方便。2001年微软发布了.NET平台和C#语言。做为一种可与JAVA相媲美的新一代编程程语言,C#给人们带来了太多惊喜。诸如C#本身依托在强大的.NET Framework平台上、具有同C+一样灵活的代码控制能力、更强的面向对象特性等等新特性,而对于我这个刚刚接触C#的新手而言,最重要的还是简洁的语法和快速应用程序开发(Rapid Application Development RAD)的设计思想,使我快速的入门,并感到使用C#编写程序真的是so easy !1.2 背景我所从事的职业是测绘技术工作,平时对计算机多媒体应用较感性趣,常非常想自己亲手编写一个媒体播放器,所以这次毕业设计我的选题是编写一个简易的媒体播放器 。在Windows平台上编写流媒体应用程序的通常使用Directshow技术。DirectShow技术是DirectX推出的建立在DirectDraw和DirectSound组件基础之上的多媒体应用程序开发工具包,它提供对多媒体数据流的高质量捕获和回放,代表着未来多媒体应用程序开发的方向。本来C#是不直接支持Directshow技术的,但最近有人使用.net平台重写了Directshow运行时库 ,在.net环境中引用这个库,就可以和使用VC+开发Directshow一样,不同之处是一些接口的名称结构的差别 。就这样,我才得以实现用C#来编写这个媒体播放器,名称叫做”Octupus Player 章鱼播放器”,叫它做章鱼是希望它像章鱼一样八面玲珑,尽管它到现在还简单的可怜 。第二章 开发环境和主要技术介绍2.1选用工具简介Visual C#.NET ,Microsoft公司推出了“Microsoft.NET 下一代互联网软件和服务战略”,使.NET利用以互联网为基础的分布式计算和通信激增的特点,通过先进的软件构架,利用网络协议和格式,来协调众多的智能设备和网站。由于C专门为.NET应用而开发的程序语言,所以它从根本上保证了C与.NET框架的完美结合。在.NET运行库的支持下,.NET框架的各种优点在C中表现的淋漓尽致。C拥有C+的强大功能以及Visual Basic简易的特性,它在带来对应用程序的快速开发能力的同时,并没有牺牲C与C+程序员所关心的各种特性,C忠实的继承了C+的优点。2.2 主要应用技术2.2.1 DirectXDirectX是Microsoft公司为游戏和其他高性能多媒体应用所提供的一套底层应用程序编程接口。这些接口包括对二维和三维图形,声效和音乐,输入设备以及多玩家网络游戏等的支持。目前DirectX的最高版本是DirectX 9.0。 DirectX的组成 DirectX 9.0由下列组件构成:(1)DirectX Graphics:该组件组合DirectX旧版本中的DirectDraw和Direct3D两个组件,使其成为一个适用于所有图形程序的单独的应用程序接口。其中的Direct3D扩展(D3DX)应用程序库简化了多数图形程序的工作。(2)DirectInput:支持各种输入设备,完全支持力反馈技术。(3)DirectPlay:支持多玩家网络游戏。(4)DirectSound:支持用于播放和捕获音频波形的高性能音频应用软件的开发。(5)DirectMusic:为音乐音轨以及基于波表、MIDI(Musical Instrument Devices Interface)或其他由DirectMusic Producer创作的非音乐音轨,提供了一套完整的解决方案。(6)DirectShow:提供对多媒体数据流的高质量捕获和回放。(7)DirectSetup:一个简单的应用程序接口,提供DirectX组件的自动安装。(8)DirectX Media Objects:提供对数据流对象的读写支持,包括视频和音频的编解码器及其效果。2.2.2 COM简介DirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,是对象连接和嵌入(Object Linking and Embedding)的基础。COM通常以动态链接库(DLL)的形式存在,它是建立在二进制规范上的对象。COM定义并实现了软部件(如应用程序、数据对象、控件及服务)机制,并把他们统称为对象。每个软部件对象由数据以及访问数据的函数组成,访问软部件对象数据的函数集合称为接口。在应用程序看来COM是一个黑箱,可调用COM提供的方法但不知道它的具体实现。在使用DirectShow编程时,用户创建的自定义组件必须以COM形式实现,所以必须知道如何实现COM。2.2.3 DirectShow技术DirectShow技术是建立在DirectDraw和DirectSound组件基础之上的,它通过DirectDraw对显卡进行控制以显示视频,通过DirectSound对声卡进行控制以播放声音。 DirectShow可提供高质量的多媒体流的捕获和回放功能;支持多种媒体格式,包括ASF(Advanced Systems Format),MPEG(Motion Picture Experts Group),AVI(Audio-Video Interleaved),MP3(MPEG Audio Layer-3)和WAV声音文件;可以从硬件上捕获媒体数据流;可以自动检测并使用视频和音频加速硬件。因此,DirectShow可以充分发挥媒体的性能,提高运行速度,可以简化媒体播放、媒体间的格式转换和媒体捕获等工作。同时,它还具有极大的可扩展性和灵活性,可以由用户自己创建组件,并将这个组件加入DirectShow结构中以支持新的格式或特殊的效果。应用程序与DirectShow组件以及DirectShow所支持的软硬件之间的关系如图1所示。图1 DirectShow系统框图 过滤器(filter)由图1可以看到,过滤器是DirectShow最基本的组成元件。过滤器是一个COM组件,是完成DirectShow处理过程的基本单元。DirectShow提供了一组标准的过滤器供应用程序使用,程序开发者也可以创建自定义的过滤器来扩充DirectShow的功能,但必须是以COM形式建立的。DirectX为用户提供了DirectShow基类库(DirectShow Base Class Library),用户自定义的过滤器都可以从基类库提供的基类和接口派生出来。过滤器主要分为以下几种类型:(1)源过滤器(source filter):源过滤器引入数据到过滤器图表中,数据来源可以是文件、网络、照相机等。不同的源过滤器处理不同类型的数据源。(2)变换过滤器(transform filter):变换过滤器的工作是获取输入流,处理数据,并生成输出流。变换过滤器对数据的处理包括编解码、格式转换、压缩解压缩等。(3)提交过滤器(renderer filter):提交过滤器在过滤器图表里处于最后一级,它们接收数据并把数据提交给外设。(4)分割过滤器(splitter filter):分割过滤器把输入流分割成多个输出。例如,AVI分割过滤器把一个AVI格式的字节流分割成视频流和音频流。(5)混合过滤器(mux filter):混合过滤器把多个输入组合成一个单独的数据流。例如,AVI混合过滤器把视频流和音频流合成一个AVI格式的字节流。过滤器的这些分类并不是绝对的,例如一个ASF读过滤器(ASF Reader filter)既是一个源过滤器又是一个分割过滤器。在DirectShow里,一组过滤器称为一个过滤器图表(filter graph)。过滤器图表用来连接过滤器以控制媒体流,它也可以将数据返回给应用程序,并搜索所支持的过滤器。过滤器有三种可能的状态:运行、停止和暂停。暂停是一种中间状态,停止状态到运行状态必定经过暂停状态。暂停可以理解为数据就绪状态,是为了快速切换到运行状态而设计的。在暂停状态下,数据线程是启动的,但被提交过滤器阻塞了。通常情况下,过滤器图表中所有过滤器的状态是一致的。 引脚(pin)过滤器可以和一个或多个过滤器相连,连接的接口也是COM形式的,称为引脚。过滤器利用引脚在各个过滤器间传输数据。每个引脚都是从Ipin这个COM对象派生出来的。每个引脚都是过滤器的私有对象,过滤器可以动态的创建引脚,销毁引脚,自由控制引脚的生存时间。引脚可以分为输入引脚(Input pin)和输出引脚(Output pin)两种类型,两个相连的引脚必须是不同种类的,即输入引脚只能和输出引脚相连,且连接的方向总是从输出引脚指向输入引脚。过滤器之间的连接(也就是引脚之间的连接),实际上是连接双方媒体类型(Media Type)协商的过程。连接的大致过程为:如果调用连接函数时已经指定了完整的媒体类型,则用这个媒体类型进行连接,成功与否都结束连接过程;如果没有指定或不完全指定了媒体类型,则进入下面的枚举过程-枚举欲连接的输入引脚上所有的媒体类型,逐一用这些媒体类型与输出引脚进行连接(如果连接函数提供了不完全媒体类型,则要先将每个枚举出来的媒体类型与它进行匹配检查),如果输出引脚也接受这种媒体类型,则引脚之间的连接宣告成功;如果所有输入引脚上枚举的媒体类型,输出引脚都不支持,则枚举输出引脚上的所有媒体类型,并逐一用这些媒体类型与输入引脚进行连接,如果输入引脚接受其中的一种媒体类型,则引脚之间的连接宣告成功;如果输出引脚上的所有媒体类型,输入引脚都不支持,则这两个引脚之间的连接过程宣告失败。过滤器与引脚连接如图2所示。图2 过滤器和引脚连接示意图 媒体类型(Media Type)媒体类型是描述数字媒体格式的一种通用的可扩展方式。两个过滤器相连时,必须使用一致的媒体类型,否则这两个过滤器就不能相连。媒体类型能识别上一级过滤器传送给下一级过滤器的数据类型,并对数据进行分类。实际在很多应用程序中,用户根本不需要担心媒体类型的问题,DirectShow会处理好所有的细节。但有些应用程序需要对媒体类型进行操作。媒体类型一般可以有两种表示:AM_MEDIA_TYPE和CMediaType。前者是一个结构,后者是从这个结构继承过来的类。每个AM_MEDIA_TYPE由三部分组成:Major type、Subtype和Format type。这三个部分都使用GUID(全局唯一标识符)来唯一标示。Major type主要定性描述一种媒体类型,这种媒体类型可以是视频、音频、比特数据流或MIDI数据等等;Subtype进一步细化媒体类型,如果是视频的话可以进一步指定是RGB-24,还是RGB-32,或是UYVY等等;Format type则用一个结构更进一步细化媒体类型。如果媒体类型的三个部分都指定了某个具体的GUID值,则称这个媒体类型是完全指定的;如果媒体类型的三个部分中有任何一个值是GUID_NULL,则称这个媒体类型是不完全指定的。GUID_NULL具有通配符的作用。 过滤器图表管理器(Filter Graph Manager)DirectShow通过过滤器图表管理器来控制过滤器图表中的过滤器。过滤器图表管理器是COM 形式的,它的功能有:协调过滤器间的状态转变;建立参考时钟;把事件(event)传送给应用程序;为应用程序提供建立过滤器图表的方法。一些常用的过滤器图表管理器接口如下:IGraphBuilder:为应用程序提供创建过滤器图表的方法。IMediaControl:提供控制过滤器图表中多媒体数据流的方法,包括运行、暂停和停止。IMediaEventEx:继承自IMediaEvent接口,处理过滤器图表的事件。IVideoWindow:用于设置多媒体播放器窗口的属性,应用程序可以用它来设置窗口的所有者、位置和尺寸等属性。IBasicAudio:用于控制音频流的音量和平衡。IBasicVideo:用于设置视频特性,如视频显示的目的区域和源区域。IMediaSeeking:提供搜索数据流位置和设置播放速率的方法。IMediaPosition:用于寻找数据流的位置。IVideoFrameStep:用于步进播放视频流,可使DirectShow应用程序,包括DVD播放器一次只播放一帧视频。 过滤器图表中的数据流动当用户要创建自定义的过滤器时,就需要了解媒体数据是如何在过滤器图表中传输的。为了在过滤器图表中传送媒体数据,DirectShow过滤器需要支持一些协议,称之为传输协议(transport)。相连的过滤器必须支持同样的传输协议,否则不能交换媒体数据。大多数的DirectShow过滤器把媒体数据保存在主存储器中,并通过引脚把数据提交给其它的过滤器,这种传输称为局部存储器传输(local memory transport)。虽然局部存储器传输在DirectShow中最常用,但并不是所有的过滤器都使用它。例如,有些过滤器通过硬件传送媒体数据,引脚只是用来提交控制信息,如IOverlay接口。DirectShow为局部存储器传输定义了两种机制:推模式(push model)和拉模式(pull model)。在推模式中,源过滤器生成数据并提交给下一级过滤器。下一级过滤器被动的接收数据,完成处理后再传送给再下一级过滤器。在拉模式中,源过滤器与一个分析过滤器相连。分析过滤器向源过滤器请求数据后,源过滤器才传送数据以响应请求。推模式使用的是IMemInputPin接口,拉模式使用IAsyncReader接口,推模式比拉模式要更常用。第3章 总体设计3.1 系统结构的设计本系统是基于Directshow技术使用C#语言开发的应用程序。DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体的捕捉和回放提供了强有力的支持。运用DirectShow我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。 另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD播放,视频的非线性编辑,以及与数据摄像机的交换。更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。构建章鱼播放器的系统结构图如3.1所示:图3.1系统结构由三层组成。最上层是应用程序层,程序界面设计,文件的读取和控制功能都要由此完成;中间层是Directshow维护的“滤波器图表管理器” ,通过“滤波器图表管理器”统一对各种内定义的“滤波器”进行控制,贯穿“媒体流”链路的整个过程。在这个过程中,“媒体滤波器”之间通过“针脚”(PIN)相互通讯 ,它们随时捕获来自应用程序的控制信息;最下面是“驱动层” ,Directshow的视音频处理能力全部都来自DirectX底层驱动库的支持。3.2系统原理 章鱼播放器可以播放下列格式的媒体文件:MPEG的音频和视频、音频和视频交(AVI)、WAVE、MIDI和高级流格式ASF。能支持这么多格式还要拜Directshow所赐,它将诸多数据结构利用Filter Graph进行统一管理,原理如下:如图3.2所示:图3.2DirectShow使用一种叫做Filter Graph的模型来管理整个数据流的处理过程,参与数据流处理的各个功能模块称做Filter,各个Filter在Filter Graph中按一定的顺序连成一条流水线协调工作,完成一些相对独立的功能,如Filter可以完成如下的一些功能:读文件、从视频设备中获取视频、对视频流进行解码、将数据送往声卡或显卡。在过滤器图表结构中,源过滤器用来从数据源获取数据,并将数据传送到过滤器图表中,这里的数据源可以是摄像机、因特网、磁盘文件等;转换过滤器用来获取、处理和传送媒体数据,它包括分离视频和音频的分解变换过滤器(Splitter transform filter)、解压视频数据的视频转换过滤器(Video transform filter)、解压音频数据的音频转换过滤器(Audio transform filter);表现过滤器用来在硬件上表现媒体数据,如显卡和声卡,或者是任何可以接受媒体数据的地方,如磁盘文件。它包括用来显示图像的视频表现过滤器(Video renderer filter)、将音频数据送到声卡上去的音频表现过滤器(Audio renderer filter)。每个Filter都有输入端和输出端,例如一个MPEG-1解码Filter它的输入是MPEG编码的流数据,它的输出端是一解码过的流数据。DirectShow正是通过将不同的Filter连接在一起完成特定的功能的,这些Filter的连接叫做Filter Graph。一切对媒体文件的控制功能都是通过从FilterGraph上实现的接口来完成的 。媒体播放器必然要用到数字视音频编码技术,这项技术是多媒体应用的基础,Directshow对此此支持和非常好,下面概述一下数字图像编码及原理:3.2.1图像压缩编码方法的分类编码压缩方法有许多种,从不同的角度出发有不同的分类方法,比如从信息论角度出发可分 为两大类: (1)冗余度压缩方法,也称无损压缩,信息保持编码或熵编码。具体讲就是解码图像和压缩 编码前的图像严格相同,没有失真,从数学上讲是一种可逆运算。 (2)信息量压缩方法,也称有损压缩,失真度编码或熵压缩编码。也就是讲解码图像和原始图像是有差别的,允许有一定的失真。 应用在多媒体中的图像压缩编码方法,从压缩编码算法原理上可以分类为: (1)无损压缩编码种类 哈夫曼编码 算术编码 行程编码 Lempel zev编码 (2)有损压缩编码种类 预测编码:DPCM,运动补偿 频率域方法:正文变换编码(如DCT),子带编码 空间域方法:统计分块编码 模型方法:分形编码,模型基编码 基于重要性:滤波,子采样,比特分配,矢量量化 (3)混合编码 JBIG,H261,JPEG,MPEG等技术标准 衡量一个压缩编码方法优劣的重要指标是: (1)压缩比要高,有几倍、几十倍,也有几百乃至几千倍; (2)压缩与解压缩要快,算法要简单,硬件实现容易; (3)解压缩的图像质量要好。 要说明的是选用编码方法时一定要考虑图像信源本身的统计特征;多媒体系统(硬件和 软件产品)的适应能力;应用环境以及技术标准。3.2.2压缩编码方法简介压缩编码的方法有几十种之多,并在编码过程中涉及较深的的数学里理论基础问题,在此仅介绍 几种常用的压缩编码方法,主要是从物理意义上作一定的解释,读者如对数据压缩专题感兴 趣的话,请参看讲座结束后所附的参考资料。 莫尔斯码与信源编码 莫尔斯码即电报码,其精华之处在于用短码来表示常出现的英文字母,用长码来表示不常出 现的字母,以减小码率。这种方法非常有效,故延用至今。电视信号经过变换后,例如经差值脉冲编码后,发现前后像素幅度差值小的概率大,而差值大的概率小,因此可用短码表示 概率大的信号,而用长码来代表概率小的信号,从而达到压缩码率的目的。 差值脉冲编码 电视图像基本上是由面积较大的像块(如蓝天、大地、服装等)组成。虽然每个像块的幅值各 不相同,但像块内各样值的幅度是相近的或相同的,幅值跃变部分相应于像块的轮廓,只占整幅图像的很小一部分。帧间相同的概率就更大了,静止图像相邻帧间的相应位置的像素完 全一样,这意味着前后像素之差或前后帧间相应位置像素之差为零或差值小的概率大,差值 大的概率小。这就是差值编码的基本想法,其原理框图见图3.3(a)。发端将当前样值和前一 样值相减所得差值经量化后进行传输,收端将收到的差值与前一个样值相加得到当前样值。 在这个原理图中,输出的当前样值是输出的前一样值加上收到的差值,由于在当前差值中包 括当前的量化误差,而输出的前一样值又包括前一样值的量化误差,这就造成了量化误差的 积累。因此实用电路为图3.3(b)。这时输入当前样值不是与输入的前一样值相减,而是与 输 出的前一样值相减,因此在差值中已经包含了前一样值的量化误差的负值,在与输出的前一 个样值相加时,这部分量化误差被抵消,只剩下当前的量化误差,这就避免了量化误差的积累。 预测编码 预测编码利用像素的相关性,可进一步减小差值。 从前面的分析可以看出,如果差值编码中小幅度出现的机会增加,由于其对应的码长较短, 总数码率会进一步减小。如果能猜出下一个样值,那么差值就会是零,当然这种情况是没有 意义的,因为若预先知道下一样值,就不需要进行通信了。但可以肯定,如果我们不仅利用 前后样值的相关性,同时也利用其它行、其它帧的像素的相关性,用更接近当前样值的预测 值与当前样值相减,小幅度差值就会增加,总数码率就会减小,这就是预测编码的方法。预 测编码的电路与差值编码类似,或者说差值编码就是以前一样值为预测值的预测编码,又称为一维预测。如果用到以前行的像素或以前帧的像素,则称为二维或三维预测。在美国国际 电话电报公司(ITT)生产的数字电视机芯片中有一个视频存储控制器芯片VMC2260就用了二维 预测编码,预测器用了三个像素作为下一个像素的预测值,即预测值等于1/2前一像素加1/4 上一行相应像素再加上1/4上一行相应的前一像素。这样不仅利用了前一像素的相关性,也 利用了上一行相应像素的相关性,这样做要比差值编码有更大的码率压缩。如果再用上前一 帧的像素会进一步降低数码率。但为了得到前一帧的像素必须要使用帧存储器,造价比较高 。只用到帧内像素的处理称为帧编码(Intraframe Coding),用到前后帧像素的处理称为帧 间编码(Interframe Coding)。要得到较大的码率压缩就必须使用帧间编码。JPEG是典型的帧内编码方案,而MPEG是帧间编码方法。前者大多用于静止图像处理,而后者主要用于对运 动图像的处理。 哈达玛特变换 这是一种有效地去除噪波的方法,噪波的存在往往容易和小幅度变化的信号相混淆,利用多帧平均的方法,对于静止图像,各帧相同,平均的结果其值不变,对于噪波,多帧平均趋于零。 但如果图像中有运动,多帧平均就会造成运动模糊,故不能简单地进行平均,需要根据运动的大小来调节反馈量,即调节平均的程度,做到运动自适应降噪。 大多数情况下是利用帧差信号来判断图像中是否有运动,如果帧差小于一定值,就可视为是因噪波引起的,可取较大的反馈量;如果帧差大于一定值,就可视为图像中有运动。 但在许多情况下,仅从幅度的大小来判断是杂波还是图像是很困难的,如移动的云,近摄的 绿草地等图像信号所得到帧差信号也很小,所以BKU-904采用二维哈达玛特变换(Hadamard Transform)来区分是噪波还是图像信号。先将输入值按42分成小块,分别进行实时快速哈 达玛特变换(FHT)。 图像经变换后,转换成相应成分的系数,这些系数分别代表直流分量;水平方向细节和色度 分量等;垂直方向细节;斜方向细节及色度分量等,而噪波变换后均匀散在各系数中。这样 就更有效地区分出信号和噪波,从而达到更有效地进行自适应降噪的目的。 离散余弦变换 离散余弦变换(Discrete cosine Transform)简称DCT。任何连续的实对称函数的傅里叶变换 中只含余弦项,因此余弦变换与傅里叶变换一样有明确 的物理量意义。DCT是先将整体图像分成NN像素块,然后对NN像素块逐一进行DCT变换。 由于 大多数图像的高频分量较小,相应于图像高频成分的系数经常为零,加上人眼对高频成分的 失真不太敏感,所以可用更粗的量化,因此传送变换系数所用的数码率要大大小于传送图像 像素所用的数码率。到达接收端后再通过反离散余弦变换回到样值,虽然会有一定的失真 ,但人眼是可以接受的。 N代表像素数,一般N=8,88的二维数据块经DCT后变成88个变换系数,这些系数都 有 明确的物理意义:U代表水平像素号,V代表垂直像素号。如当U=0,V=0时,F(0,0)是原 64个 样值的平均,相当于直流分量,随着U、V值增加,相应系数分别代表逐步增加的水平空间频 率分量和垂直空间频率分量的大小。 量化(Q) 严格说DCT本身并不能进行码率压缩,因为64个样值仍然得到64个系数,如图42所示。这 里 给出了一个88像块的具体例子,经DCT变换后,比特数增加了。在这个例子中样值是8比特 ,从0225得到的XX,即直流分量的最大值是原来256的64/8倍,即02047,交流分 量的范围是-10241023。只是在经过量化后,特别是按人眼的生理特征对低频分量和高频分 量设置不同的量化,会使大多数高频分量的系数变为零。一般说来,人眼对低频分量比较敏 感,而对高频分量不太敏感。因此对低频分量采用较细的量化,而对高频分量采用较粗的量化。所谓量化,即根据不同的要求,设置不同的量化等级,从而降低数码率。 游程长度编码读出数据和表示数据的方式也是减少码率的一个重要因素。读出的方式可以有多种选择 ,如 水平逐行读出、垂直逐列读出、之字型读出和交替读出等,其中之字型读出(ZigZag) 是最常用的一种。由于经DCT变换以后,系数大多数集中在左上角,即低频分量区,因此之 字型读出实际上是按二维频率的高低顺序读出系数的,这样一来就为游程长度编码(Runleng th Encoding)创造了条件。所谓游程长度编码是指一个码可同时表示码的值和前面几个零, 这样就可以把之字型读出的优点显示出来了。因为之字型读出在大多数情况下出现连零的机 会比较多,尤其在最后,如果都是零,在读到最后一个数后只要给出“块结束”(EOB)码, 就可以结束输出,因此节省了很多码率。 游程长度指的是由字构成的数据流中各个字符连续重复出现而形成字符串的长度。 基本的游程编码就是在数据流中直接用三个字符来给出上述三种信息,其数据结构如图3.5所示。 SC表示有一个字符串在此位置,X代表构成串的字符,CC代表串的长度。游程编码和哈夫曼编码等属于统计编码。 霍夫曼编码 霍夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。下面引证一个定理,该定 理保证了按字符出现概率分配码长,可使平均码长最短。 定理:在变字长编码中,如果码字长度严格按照对应符号出现的概率大小逆序排列,则其平 均码字长度为最小。 现在通过一个实例来说明上述定理的实现过程。设将信源符号按出现的概率大小顺序排列为 : U: ( a1 a2 a3 a4 a5 a6 a7 ) 0.20 0.19 0.18 0.17 0.15 0.10 0.01 给概率最小的两个符号a6与a7分别指定为“1”与“0”,然后将它们的概率相加再与原来的 a1a5组合并重新排序成新的原为:U: ( a1 a2 a3 a4 a5 a6 ) 0.20 0.19 0.18 0.17 0.15 0.11 对a5与a6分别指定“1”与“0”后,再作概率相加并重新按概率排序得U:(0.26 0.20 0.19 0.18 0.17) 直到最后得 U:(0.61 0.39) 分别给以“0”,“1”为止,如图3.6所示。 霍夫曼编码的具体方法:先按出现的概率大小排队,把两个最小的概率相加,作为新的概率 和剩余的概率重新排队,再把最小的两个概率相加,再重新排队,直到最后变成1。每次相 加时都将“0”和“1”赋与相加的两个概率,读出时由该符号开始一直走到最后的“1”, 将路线上所遇到的“0”和“1”按最低位到最高位的顺序排好,就是该符号的霍夫曼编码。 例如a7从左至右,由U至U,其码字为0000; a6按践线将所遇到的“0”和“1”按最低位到最高位的顺序排好,其码字为0001 用霍夫曼编码所得的平均比特率为:码长出现概率 上例为: 0.22+0.192+0.183+0.173+0.153+0.14+0.014=2.72 bit 可以算出本例的信源熵为2.61bit,二者已经是很接近了。 运动估计的运动补偿编码 这是一种帧间编码的方法,其原理是利用帧间的空间相关性,减小空间冗余度。帧间编码为什么可以减小冗余度,这是因为两帧之间有很大的相似性。如果将前后两帧相减 (移动物体作相应位移)得到的误差作编码所需比特要比帧内编码所需的比特少,帧间差集中 在零附近,可以用短的码字传送。 实现帧间编码的方法是运动估计和运动补偿。用图3.7来说明这个过程。 当前帧在过去帧的窗口中寻找匹配部分,从中找到运动矢量; 根据运动矢量,将过去帧位移,求得对当前帧的估计; 将这个估计和当前帧相减,求得估计的误差值; 将运动矢量和估计的误差值送到接收端去。 接收端根据收到的运动矢量将过去帧作位移(也就是对当前帧的估计),再加上接 收到的误差 值,就是当前帧了。图3.9运动估计的全局搜索块匹配 实际上,在做运动估计和运动补偿时,是以1616的块(称宏块)逐个进行的,如图3.8所示 ,这是将当前帧划分为NN(1616)的块。对每一块在过去帧中范围为的范围内进行搜索,以求得最优匹配,从而得到运动矢量的估值(dx,dy)。衡量匹配好坏 的准则可以是均方误差最小准则。搜索方法可以是全局搜索法,即对搜索范围内的每一点都 计算均方误差,选最小值即对应最优匹配,如图3.9所示。3.2.3MPEG压缩编码方法简介MPEG用句法规定了一个层次性的结构,共分六层。这六层是图像序列(Video Sequence)-图像组(Group of Picture)-图像(Picture)-宏块条(Silce)- 宏块(Macroblock )-块(Block)。 一个图像包含亮度阵列和色度阵列。在MPEG- 1中亮度和色度的格式是420,而在MPEG-2 中,除这一格式外,还允许有422及444。六个层次有其不同的功能,如下表所示:语法规定的层次功 能语法规定的层次功 能 序列层(Sequence layer)随机存取段落宏块条层(Slice layer)重新同步单元图像组层(Group of picture layer)随机存取视频单元宏块层(Macroblock layer)运动补偿单元 图像层(Picture layer)基本编码单元块层(Block layer)DCT单元所谓420是指在垂直方向每隔一行去除一行色度信号。 MPEG-1和MPEG-2中三种类型图像MPEG在利用块匹配运动补偿来减小时间冗余度时,不仅用上一帧的图像预测当前图像, 而且也使用下一帧图像预测当前图像,即双向预测,这是和H.261标准有重要区别的地方。 因此 ,MPEG-1和2中有三种类型图像,即I、B、P三种,如图3.10所示。I帧是帧内编码,P帧是正向预测,如图3.11所示,通过正向预测得到的图。B帧是双向预测图 ,如图3.12所示。由于B帧不能作其他图像的基准,所以对B帧编码较粗(步长较大),需要比特数比预测图P少。 MPEG- 1的视频压缩编码MPEG-1中视频编码的关键压缩技术和H.261一样,仍是DCT、运动补偿和Huffman编码。编码 器和解码器的原理框图也和H.261没有区别。 MPEG-1的信源输入格式是SIF(Source Input Format)。CCIR601格式的信源要转换成SIF后进 入MPEG- 1编码器,解码器输出也是SIF格式,显示时要经内插,扩充为CCIR601格式。PAL/NT SC都作如此处理。SIF格式如下表所示。信号分量 行数/帧 象素数/行 亮度(Y) 240/288 352 色度(Cb) 120/144 176 色度(Cr) 120/144 176 图3.13所示为MPEG-1视频编码器。图中和H.261不同的部分是有二组运动补偿和存储器, 并有相应的转换开关。这是因为MPEG- 1有B图像要处理。开关有4种状态,0是针对帧内 编码,“2”或“3”是用上一帧图像(经S2的虚线a/c)或用下一帧图像(经S2的实线 d/b) ,“4”是用了上一帧和下一帧两幅图像(经S2的实线b和实线c),这时候要相应产生2 个运 动矢量。 MPEG- 2视频压缩编码 研究制定MPEG标准是为了使应用于数字存储媒体、电视广播、通信等方面的运动图像和 伴音 有一种通用的编码方法。使用这个标准意味着运动图像可以作为一种计算机数据来处理 ,并且能够存储在各种各样的存储器中,也可以在现有的或未来的网络中传送和接收,还可以在现在的或将来的广播信道中广播。 这个标准的应用很广泛,覆盖了从电视电话到高清晰度电视。 (1)划分为不同的“Profile”和“Level”(“类”和“级”)。由于想使这个标准适用于各种不同的应用,而各种应用在码率、分辨力、图像质量和服务方面要求又各不相同,所以希望这个标准要有通用性。在这个标准产生的过程中,考虑了各种应用的不同要求,开发了必要的算法,并且把它们集中成为一种单一的句法。正因为如此,这个标准使得各种不同应用 的码 流之间可以灵活地相互改变。 既要使句法有通用性,又不能要求具体的解码器全面满足整个句法的需要,那样具体的解码器就太复杂了。为了解决通用性和特殊性的矛盾,设想将整个ISO/IEC的句法分成子集,这样分的子集就称为Profile,我们称之为“类”。这个“类”规定的子集还觉得太大,有必要再分得细一些。例如图像的尽寸有小的,有大的,大的可大到,实际上不会有一个解码器能够处理这么大的动态范围的图像,因此,在Profile中又规定了“level”,称为级。 ISO/IEC13818-2(即MPEG-2视频)规定了5个类和4个级如下表所示。类级Simple ProfileMain ProfileSNR Scalable ProfileSpstiallyScalable ProfileHighProfileHigh LevelHigh-1440 LevelMain LevelLow Level注:Main Profile(主类):图像质量合乎一定要求,允许有一定损伤,不具有可分级性; Simple Profile (简化类):如Main Profile相同,只是不用B帧,这是为了节约RAM; SNR Scalable Profile(信噪比可选类):比Main Profile改进之处是信噪比可分级; Spatially Scalable Profile(空间尺寸可选类):空间分辨率方面也可分级; HIgh Profile(高质量类):支持422并全面可分级(宏块的组成是:4个Y块+2个Cb块 +2个Cr块); Low Level(低级):类似H.261中的CIF格式; Wain Level(主级):相应于普通电视; High 1440 Level(高1440级):大致相当于具有每行1440个采样的HDTV; High Level(高级):大致相当于每行1920个采样的HDTV。 MPEG-2格式经常用级和类的缩写表示,如:MPML是指主类和主级,目前用于普通数字电视 、卫星、电缆、广播的DVB标准就是用这一格式。 (2)MPEG-2的编解码器和MPEG-1的异同。 MPEG-1只处理逐行扫描的电视图像而MPEG-2既处理逐行扫描也处理隔行扫描,因此编码器中要有场/帧决策的功能; DCT有二种: 帧DCT或场DCT; 运动估计有四种:场预测、帧预测、双场预测和168的运动补偿; 压缩编码方式均采用运动检测补偿、DCT、量化、霍夫曼编码、游程编码和VLC等。 MPEG-2系统 MPEG-2系统的作用如图3.14所示。它有以下几个任务: (1)对音频、视频、数据、控制等基本比特流起系统复用的作用。 (2)提供用于恢复时间基准的时间标志,缓冲器初始化和管理,音频和视频的解码时间,显示时间。 (3)给解码器提供一种信息(PSI),使之更容易和更迅速地找到所需节目。 (4)给误差恢复,有条件接入,随机接入,数字存储控制提供支持。 视频或音频编码器的输出被打成PES(Packetised Elementary Streanis),然后在PS复用器中被组合成PS(Program Stream)或在TS复用器中被组合成TS(Transport Strea m),前者用于相对无误差的环境,后者用于有噪声媒质。 第4章 详细设计4.1业务流程 根据概要设计中的系统结构图和模块方块图以及用户对系统的需求确定下业务流程图:退出调节音量调节进度播放控制使用者 打开媒体文件 图4.1业务流程图4.2 数据流程图根据业务流程图得到如下数据流程图:Filter Graph Manager滤波器管理器应用程序返回的信息图4.2顶层数据流图软件二层数据流图如图4.3所示 , 源过滤器(source filter):源过滤器引入数据到过滤器图表中,数据来源可以是文件、网络、照相机等。不同的源过滤器处理不同类型的数据源。变换过滤器(transform filter):变换过滤器的工作是获取输入流,处理数据,并生成输出流。变换过滤器对数据的处理包括编解码、格式转换、压缩解压缩等。 图4.3二层数据流图4.3 模块及界面设计各功能模块的实现软件功能模块如下图所示:程序界面如图4.4所示图4.4开发步骤:所有的DirectShow应用都必须完成三件事情 1 生成Filter Graph管理器的一个实例。2 利用Filter Grapth实例生成Filter Graph,具体应该由哪些Filter组成Filter Graph视我们的应用的需要而定。3 通过对Filter Graph管理器的方法调用和来自Filter Graph的消息的响应Filter Graph和数据流进行控制。设置环境在利用DirectShow进行流媒体的处理之前,必须正确安装DirectX的SDK,DirectX SDK可以到微软的网站上下载,目前,DirectX最新版本为9.0。在正确安装好DirectX SDK后,我们必须设置DirectX SDK的头文件和库文件,使其在Visual Studio的搜索路径内。对于Visual Studio .NET 2003可如下进行设置:菜单工具选项项目VC+目录,在包含文件中加入D:DXSDKInclude,在库文件中加入D:DXSDKlib(我的SDK的安装路径是D:DXSDK):头文件文件名称描述Dshow.h所有的DirectShow应用都必须包含库文件文件名称描述Strmiids.lib此库文件中导出类标识(CLSID)和接口标识(IID),所有的DirectShow应用都必须包含此文件。Quartz.lib此库文件中导出函数AMGetErrorText,如果你的程序中调用了此函数,则必须包含此库文件。开始工程打开Visual Studio .NET 2003,文件新建项目3.设置工程属性: 设置输出文件扩展名为EXE 。输出类型为Windows应用程序。默认命名空间为Directshow。在引用路径选项卡中设置如图所示:设置引用名称空间:要使用.net framework库中的类和接口必须声明这些类和接口的名称空间,同在VC+中使用include导入头文件,和在JAVA中用import包文件的作用是一样的。下面是文程序必须导入的名称空间。using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using QuartzTypeLib;创建过滤器图表管理器本节是基于DirectShow开发简单媒体播放器的关键步骤。初始化DirectShow由于DirectSh

温馨提示

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

评论

0/150

提交评论