视频播放与图像捕捉.doc_第1页
视频播放与图像捕捉.doc_第2页
视频播放与图像捕捉.doc_第3页
视频播放与图像捕捉.doc_第4页
视频播放与图像捕捉.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

视频播放与图像捕捉1、Direct Show技术DirectX是美国微软公司为软件开发者提供的多媒体开发平台,它包括DirectShow, DirectDraw,Direct3D和DirectMusic等。借助于DirectX所提供的应用程序编程接口(API),软件开发者不用编写与硬件相关的代码,就可以开发出高性能的多媒体应用程序。DirectShow是为播放各种类型的视频数据、音频数据或其他多媒体数据而设计的。DirectShow支持MPEG(包括MP3 ),AVI, MOV, WAV, DVD等格式。软件开发者也可以拓展DirectShow,使其支持自定义的格式。借助于DirectShow,我们可以很容易地实现多种格式的多媒体数据的回放、传输和捕获。DirectShow取代了早期的Windows多媒体服务、媒体控制接口(MCI),SDK等。1.1Direct Show系统 如图3.1DirectShow系统DirectShow系统位于应用层中。它使用一种叫Filter Graph的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫做Filter;各个Filter在Filter Graph中按一定的顺序连接成一条“流水线”协同工作。按照功能来分,Filter大致分为三类:Source Filters、Transform Filters和Rendering Filters。Source Filters主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡(WDM驱动或VFW驱动的)、数字摄像机等,然后将数据往下传输;Transform Fitlers主要负责数据的格式转换比如数据流分离/合成、解码/编码等,以及继续往下传输;Rendering Filter主要负责数据的最终去向将数据送给显卡、声卡进行多媒体的演示,或者输出到文件进行存储。1.2 Direct Show体系结构 DirectShow是一个基于COM(组件对象模型)的系统,由许多模块化的软件组件组成。在这个系统中,最基本的构造模块是称为过滤器(Filter)的软件组件。DirectShow将多媒体数据的处理过程分为若干步骤,每一步由一个过滤器来完成,对多媒体数据流执行一个简单的操作。过滤器有输入和输出,它接受输入并产生输出。例如,对于一个解码过滤器,它的输入是按某种格式经过编码的多媒体数据流,它输出的是经过过滤器解码的数据流。在应用程序中,为了完成对多媒体数据的处理,需要将若干过滤器连接起来,一个的输出作为另一个的输入,这样连接在一起的一组过滤器称为过滤器流水线(Filter Graph)。过滤器流水线也掌握着每一步该使用哪一个过滤器及这些过滤器之间是如何连接的。这样,多媒体数据流就在过滤器流水线上,从源过滤器经由中间过滤器移动到播放过滤器,从而得到播放。在这个过程中完成了数据的读取、解码、将数据输出到相应的设备、播放等操作。过滤器之间数据传输的细节由插头(Pin)来处理。插头实际上是一个COM对象,分为输入插头和输出插头,一个过滤器包含一个输入插头和一个输出插头,或者包含其中的一个。插头相当于过滤器之间的连结点,位于上游的过滤器的输出插头和位于下游的过滤器的输入插头连结在一起。过滤器及过滤器流水线的管理,是由一个更高一级组件来完成的,即过滤器流水线管理器(Filter Graph Manager),它提供对经过流水线的数据流的高级控制。通常,它会自动地为你处理数据流。应用程序一般不用直接操作过滤器,只需要执行一些较高级的调用,如运行(Run)、停止(Stop)等。1.3 Direct Show的基本接口DirectShow中包含了众多的软件组件,这些组件提供了各种COM接口。有的接口提供对过滤器流水线的高级控制,有的提供低级控制,以满足不同层次的应用程序开发的需要。应用程序经常用到几个基本接口如下:(1)IGraphBuilder接口应用程序通过此接口建立过滤器流水线。主要方法为:RenderFile,自动识别多媒体文件的类型、格式,建立适用于该格式的过滤器流水线。(2)IMediaEventEx接口应用程序通过此接口获得播放过程中发生的事件,如EC_ COMPLETE(播放完毕)等。主要方法为:SetNotifyWindow,指定处理事件通知的窗口;GetEvent,获得事件。(3)IVideoWindow接口控制视频窗口的属性。主要方法为:put_Owner指定视频窗口的父窗口;put_ FullScreenMode,指定全屏播放模式;SetWindowPosition,指定视频窗口的位置;put_MessageDrain,指定一个窗口,用于接收视频窗口发出的鼠标等消息。 (4)IMediaContro 1接口 控制过滤器流水线的运行。主要方法为:Run,开始运行;Pause,暂停运行;Stop,停止运行。 (5)IMediaSeeking接口 提供了对多媒体数据流的播放位置等属性的精确控制。主要方法为:Setpositions,设置播放的起始和终止位置;GetCurrentPosition,获得当前播放位置。 (6)IBasicAudio接口控制音频数据流的基本属性:音量和均衡。主要方法:put-Volume, get-Volume,设置或获得音量;put-Balance, get_ Balance,设置或获得均衡。2播放一个AVI文件DirectShow提供了大量的Filter,用以支撑最基本的应用。下图即是一条典型的AVI文件回放的Filter Graph链路: 如图3.2本地AVI文件的回放链路如图3.2所示,箭头方向即是数据的流向,对照图1.1, File Source(Async)即属于Source Filters,它用于管理硬盘上的指定播放的文件,并根据AVI Splitter的要求提供数据;AVI Splitter和AVI Decompressor即属于Transform Filters,其中AVI Splitter负责向File Source (Async)索取数据,并将取得的数据包含的音视频分离,然后分别从各自的输出Pin输出,AVI Decompressor负责视频的解码;Video Renderer和Default DirectSound Device即属于Rendering Filters,其中Video Renderer负责向视频窗口输出图像,Default DirectSound Device负责同步播放声音。2.1系统实现过程/*接口指针*/IGraphBuilder *m_pIGBuilder;IMediaControl *m_pIMControl;IMediaEventEx *m_pIMEventEx;IVideoWindow *m_pIVWindow;IMediaSeeking *m_pIMSeeking;IBasicAudio *m_pIBAudio;IBasicVideo *m_pIBVideo;CWnd *m_pwndParentWindow; /指向父窗口的指针bool m_bIsAudioIn; /是否包含音频信息bool m_bIsVideoIn; /是否包含视频信息利用DirectShow播放多媒体文件的具体过程主要包含如下的几个步骤: (这里仅给出主要方法的实现细节)(1) 建立过滤器流水线组件的实例;(2) 读取文件并准备播放(通过IGraphBuilderRenderFile)(3) 获得基本接口;(4) 获得媒体类型并配置视频窗口(如果包含视频信息)。(5) 运行操作过滤器流水线。其具体的实现细节如下:/*创建过滤器流水线组件的实例对象*/HRESULT hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_NPROC_ERVER, IID_GraphBuilder,(void *)m_pIGBuilder);/*读取文件*/WCHAR fnMAX PATH;/将文件名转换为Unicode格式MultiByteToWideChar (CP_ACP,0,pfname,-l ,fn, MAX_ PATH);hr=m_pIGBuilder-RenderFile(fn, NULL);/*获得基本接口*/hr =m_pIGBuilder-QueryInterface(IID_IMediaControl,( void*)&m_pIMControl);/*以下用相同方式依次获得各基本接口,略*/*获得媒体类型*/hr=m_pIBAudio-get_Volume(&volume); /若hr=E_NOTIMPL,不含音频if (hr=E_NOTIMPL) m_bIsAudioIn=FALSE;else m_IsAudioIn=TRUE;hr=m_pIVWindow-get_Visible(&visible);/若hr=E_NOINTERFACE,不含视频if(hr=E_NOINTERFACE) m_bIsVideoIn=FALSE;else m_bIsVideoIn=TRUE;/*配置视频窗口*/if(!m_bIsVideoIn) return; /不包含视频则返回/设置父窗口及相关的操作m_pwndParentWindow=pparwin;m_pIVWindow-put_Owner(OAHWND)pparwin-m_hWnd);m_pIMEventEx-SetNotifyWindow(OAHWND)ppar_win-m_hWnd,WM_OTIFICATION,0);m_pIVWindow-put_WindowStyle(WS_CHILD,IWS_CLIPCHILDRENIWS_ CLIPSIBLINGS);/*设置视频窗口及父窗口的位置*/long w, h; RECT rect;m_pIBVideo-GetVideoSize(&w,&h);pparwin-GetClientRect(&rect);pparwin-SetWindowPos(NULL,rect.left,rect.top,rect.left+w,rect.top+h, SWP_NOMOVE_ISWP_SHOWWINDOW);m_pIVWindow-SetWindowPosition(rect.left,rect.top,rect.left+w, rect.top+h);/*视频运行操作*/m_pIMControl-Run(); /播放m_pIMControl-Pause(); /停止m_pIMControl-Stop(); /暂停/*将播放的起始位置设为最开头*/LONGLONG pos=0;M_pIMSeeking-SetPositions(&pos,AM_SEEKING-AbsolutePositioning, NULL, AM_SEEKING-Positioning);M_pIMControl-Pause();2.2提取图像 Direct Show技术中接口BasicVideo:GetCurrentImage()提供获得当前视频图像,即获得视频帧的图片抓取,它是从Filter Graph Manager上获得,真正实现在Render Filter上,但注意此方法是不可靠的,调用函数时,Video Render必须处于暂停状态,这就使得视频文件的播放不流畅,用GetCurrentImage()获得图像数据,按照一般的图像写入方式写进.BMP文件中,即实现了图片的抓取。 在确定视频流的位置时,使用ImediaSekking:Setposition(

温馨提示

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

评论

0/150

提交评论