多媒体处理技术相关知识.ppt_第1页
多媒体处理技术相关知识.ppt_第2页
多媒体处理技术相关知识.ppt_第3页
多媒体处理技术相关知识.ppt_第4页
多媒体处理技术相关知识.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、多媒体处理技术相关知识,主要内容,数字图像的原始文件格式 图像浏览工具YUVView 文件读取 视频解码流程 基于DirectShow的多媒体编程,数字图像的原始文件格式,RGB格式 bmp文件 图像处理 YUV格式 yuv文件 视频处理,bmp文件,14bytes typedefstructtagBITMAPFILEHEADER WORDbfType; DWORDbfSize; WORDbfReserved1; WORDbfReserved2; DWORDbfOffBits; BITMAPFILEHEADER,40bytes typedef struct tagBITMAPINFOHEADE

2、R DWORDbiSize; LONGbiWidth; LONGbiHeight; WORDbiPlanes; WORDbiBitCount DWORDbiCompression; DWORDbiSizeImage; LONGbiXPelsPerMeter; LONGbiYPelsPerMeter; DWORDbiClrUsed; DWORDbiClrImportant; BITMAPINFOHEADER,typedef struct tagRGBQUAD BYTErgbBlue;/该颜色的蓝色分量 BYTErgbGreen;/该颜色的绿色分量 BYTErgbRed;/该颜色的红色分量 BYT

3、ErgbReserved;/保留值 RGBQUAD,调色板Palette是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的,yuv文件,浏览工具YUVviewer:完成YUVRGB转换,yuv文件读取,fileId = fopen(fileName, r); subSampleMat = 1, 1; 1, 1; % read Y component buf = fread(fileId, width * height, uchar); imgYuv(:, :, 1) = reshape(buf, width, height).; % reshape % read U compo

4、nent buf = fread(fileId, width / 2 * height / 2, uchar); imgYuv(:, :, 2) = kron(reshape(buf, width / 2, height / 2)., subSampleMat); % read V component buf = fread(fileId, width / 2 * height / 2, uchar); imgYuv(:, :, 3) = kron(reshape(buf, width / 2, height / 2)., subSampleMat); % reshape and upsamp

5、le % convert YUV to RGB imgRgb = reshape(convertYuvToRgb(reshape(imgYuv, height * width, 3), height, width, 3); fclose(fileId); imshow(imgRgb,运动估计中的块匹配方法,块匹配准则,1)归一化相关函数NCCF (Normalized Cross-Correction Function) (1) (2)平均均方误差函数MSD (Mean Square Difference) (2) (3)平均绝对差函数MAD (Mean Absolute Difference

6、) (3) 通常使用求和绝对差SAD(Sum of Absolut Difference)代替MAD,即,i-6 i-5 i-4 i-3 i-2 i-1 i i+1 i+2 i+3 i+4 i+5 i+6,j+6j+5 j+4 j+3j+2 j+1 j j-1 j-2 j-3 j-4 j-5 j-6,三步法(TSS,当前帧中 的子块,位移矢量,前一帧中的 搜索区域,i,j,前一帧中的最佳匹配子块,视频解码流程,视频文件 (mpg/mov,相应解码器,YUV-RGB,电视编码,显 示 器,电 视 机,DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与Dire

7、ctX开发包一起发布。为多媒体流的捕捉和回放提供了强有力的支持。DirectShow的设计初衷就是尽量让多媒体的应用开发得到简化,使程序员从复杂的数据传输、硬件差异、流同步等工作中解放出来,基于DirectShow的多媒体编程,DirectShow系统框图,DirectShow原理,Filter概述 Filter Graph 媒体类型 数据传送 状态转换 速率调整 事件通知 音视频同步 对硬件的支持,Filter概述,Directshow是基于模块化的,每个功能模块都采取COM组件方式,称为Filter。Directshow提供了一系列的标准的模块可用于应用开发,开发者也可以开发自己的功能Fi

8、lter来扩展Directshow的应用。Filter一般是有一个或多个Pin组成,Filter之间通过Pin相互连接。DirectShow使用Filter Grpah来管理Filter,Filter的类型,源过滤器(Source Filter) 分割过滤器(Splitter Filter) 解码过滤器(Decoder Filter) 渲染过滤器(Renderer Filter) 过滤器的这些分类并不是绝对的,例如一个ASF读过滤器(ASF Reader Filter)既是一个源过滤器又是一个分割过滤器,下面我们用一个例子来说明如何采取Filter来播放一个AVI的视频文件。 1) 首先从一个

9、文件中读取AVI数据,形成字节流。(这个工作由源Filter完成) 2) 检查AVI数据流的头格式,然后通过AVI分割Filter将视频流和音频流分开。 3) 解码视频流,根据压缩格式的不同,选取不同的decoder filters 。 4) 通过Renderer Filter重画视频图像。 5) 音频流送到声卡进行播放,一般采用缺省的 DirectSound DeviceFilter,Filter Graph,AVI格式媒体的Filter Graph,Filter Graph建立,在DirectShow中,Filter Graph是由接口对象IGraphBuilder实现的,可以调用Win3

10、2 API函数CoCreateInstance()建立一个实体。Filter Graph实体建立之后不包含任何的Filter,因此不具有任何实际用途。需要连接合适的Filter来完成FilterGraph的构建,1)RenderFile IGraphBuilder提供了多种智能完成FilterGraph构建的方法。最简单的是使用接口方法IGraphBuilder:RenderFile。HRESULT RenderFile(LPCWSTR lpwstrFile, LPCWSTR lpwstrPlayList); 2)Render 这个接口方法从一个输出Pin开始,自动构建剩余的FilterGra

11、ph。这个方法自动添加必要的Filter,直到添加到一个Render Filter为止。 3)ConnectDriect 这个方法尝试将两个Filter直接相连,如果不成功,直接返回。不作其他处理。这个接口方法一般用作两个Pin之间的协商检查,而不直接用于两个Filter的连接,4)Connect 这个接口方法是ConnectDirect接口方法的延伸和扩展。同样是连接两个Filter,但是与ConnectDirect方法不同的是,这个接口方法首先尝试ConnectDirect方法连接两个Filter,如果不能直接连接,则尝试使用中间Filter连接。 5)AddFilter 这个接口方法将指

12、定的Filter加入到Filter Graph中,但这个新加入的Filter并不会和Filter Graph中的其他Filter形成连接。 6) 手动构建Filter Graph 手工构建Filter Graph的基础在于对于媒体文件所需要的Filter有着相当深入清晰地了解的基础上。否则,手工构架的FilterGraph将存在可靠性、健壮性等问题,智能连接,RenderFile、Render与Connect这三种方法都有自动的功能。在DirectShow中,这种自动机制称为智能连接,为什么在智能连接中不同类型的Filter会连在各自的位置上呢?这是因为这些Filter能接受的媒体类型不同。一

13、般来讲,从源Filter出来的数据流,只简单的带有属于哪种编码格式信息,其它信息都是未知的,所以音/视频解码Filter不能用,音/视频渲染Filter也不能用,只有分离Filter可能匹配这种媒体类型,所以只会试连分离Filter。而从分离Filter出来的数据分为音、视频两路,每路的数据流都加上了是音频还是视频的信息,但没有标明这是何种音频或何种视频的信息,所以可以被音/视频解码器Filter接受,但不会被音/视频渲染Filter接受。而从解码Filter出来的数据流带上了是何种格式的音/视频媒体类型的信息,所以能被音/视频渲染Filter接受,媒体类型,Filter总是要处理一定格式的数

14、据流。DirectShow便是用媒体类型来描述特定的数据流。媒体类型实际上是DirectShow定义的一个数据结构。当两个Filter连接的时候,他们会就采用哪一种媒体类型达成一致的协议。媒体类型主要用三部分来描述:majortype、subtype和formattype。这三部分各自用一个GUID来标示,majortype:定性地描述媒体类型,如指定这是一个视频(MEDIATYPE_Video)、音频(MEDIATYPE_Audio)或者字节流(MEDIATYPE_Stream)等。 subtype:辅助说明majortype,指明具体是哪种格式,例如majortype是视频,subtype

15、可以进一步指明是UYVY、YUY2、RGB24或RGB32等;若majortype是音频,subtype可以进一步指明是PCM格式还是AC3格式等。 formattype:指定了一种进一步描述格式细节的数据结构类型,格式细节描述的内容主要包括视频图像的大小、帧率,或音频的采样频率、量化精度等参数,数据传送,Filter通过pin的连接来传递数据,数据流是从一个Filter的输出pin流向相连的Filter的输入pin。输出pin常用的传递数据的方式是调用输入pin上的IMemInputPin:Receive方法。 在Directshow中用来进行内存分配任务的是内存分配器(allocator)

16、,这是一个COM对象。当两个pin连接的时候,必须有一个pin提供一个allocator。Directshow定义了一系列函数来确定由哪个pin提供allocator,以及buffer的数量和大小。 在数据流开始之前,allocator会创建一个内存池,在开始发送数据流以后,源Filter就会将数据填充到内存池中一个空闲的buffer中,然后传递给下面的Filter。但是,源Filter并不是直接将内存buffer的指针直接传递给下游的Filter,而是通过一个media samples的COM对象,这个sample是allocator创建的用来管理内存buffer。 当一个Filter正在使

17、用buffer,它就会保持一个sample的引用计数,allocator通过sample的引用计数用来确定是否可以重新使用一个buffer。这样就防止了buffer的使用冲突,当所有的Filter都释放了对sample的引用,sample才返回到allocator的内存池,供重新使用,状态转换,Filter Graph在任何时候只有三种状态:运行、暂停、停止。其中暂停可以理解为数据就绪状态,是为了快速切换到运行状态而设计的。作为一种中间状态,暂停也是停止与运行之间切换所必经的一种状态。 对Filter Graph状态的控制也就集中在三种状态之间的切换。在IGraphBuilder上申请IMed

18、iaControl接口。获得这个接口后,就可以使用其接口方法: IMediaControl:Run(); IMediaControl:Pause(); IMediaControl:Stop(); IMediaControl: GetState( LONG msTimeout, OAFilterState *pfs,速率调整,媒体文件播放时的当前位置和停止位置相对于开始位置都是不变的。调用IMediaSeeking接口的SetRate方法可以改变播放的速率。当应用程序执行了IMediaSeeking:SetRate后,Filter Graph Manager的内部响应如下: 1)调用IMedia

19、Seeking:GetCurrentPosition得到当前播放位置 2)如果当前Filter Graph处于暂停或运行状态,则调用Stop 3)调用IMediaSeeking:SetPosition将步骤(1)中取得的当前位置重新设置一下 4)调用IMediaSeeking:SetRate设置新的播放速率 5)如果先前Filter Graph的状态为暂停或运行,则恢复这个暂停 利用IMediaSeeking接口的GetCurrentPosition和SetPosition可以实现媒体的随机定位,事件通知,DirectShow有一种机制,能够让应用程序与Filter Graph Manager

20、之间实现交互控制。这个机制就是事件通知(Event Notification),即当Filter状态转换、运行时遇到错误或要求重绘视频窗口时,都会发出一个特定的事件,由Filter Graph Manager处理或者转发给应用程序,应用程序可以接受事件,并根据事件类型作出相应的处理。 应用程序调用IMediaEvent:GetEvent方法来接收数据。这个方法会被阻断直到从一个队列中得到一个事件或者超过时限。因为事件通知和消息循环都是异步的,所以在应用程序对消息作出响应时,队列中有可能包含多个事件消息。因此,在事件处理代码中,应不停地的调用GetEvent方法,直至返回失败码,即消息队列已为空

21、,音视频同步,DirectShow的解决方案就是为Filter Graph选择一个公共的参考时钟,并且要求传送到Render Filter的每个Sample打上时间戳;Video Render和Audio Render根据Sample的时间戳以及参考时钟当前的参考时间,来正确安排Sample的播放时机。如果Sample到底的时间晚了,则马上播放这个Sample或丢弃该Sample,然后发生消息要求加快Sample的传送;如果Sample到达的时间早了,则Render Filter等待,直到Sample时间戳的开始时间再开始播放,并发生消息要求减慢Sample的发送,硬件支持,为了提高系统的稳定性,Windows操作系统对硬件操作进行了隔离;应用程序一般不能直接访问硬件。DirectShow?Filter工作在用户模式(User mode,操作系统特

温馨提示

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

评论

0/150

提交评论