directshow采集多媒体音视频同步_第1页
directshow采集多媒体音视频同步_第2页
directshow采集多媒体音视频同步_第3页
directshow采集多媒体音视频同步_第4页
全文预览已结束

下载本文档

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

文档简介

随着计算机网络和多媒体技术的发展,多媒体应用如视频会议、远程监控、远程教育、可视电话、医疗视频会诊等迅速兴起,视频和音频捕获成为多媒体应用中的关键环节和重要前提。目前采用较多的基于设备软件开发工具箱(SDK)的捕获方式存在成本较高、灵活性和扩展性较差等问题,难以满足用户需求和网络环境的变化。微软公司推出的多媒体开发软件包———DirectShow成为解决这些问题的一个有力工具。DirectShow提供高质量的多媒体数据流的捕获和回放功能,广泛支持多种媒体格式,包括ASF、MPEG、AVI、DV、MP3和WAV等。同时DirectShow对VFW具有良好的兼容性,并具有其无法比拟的优势,包括支持大量多媒体数据捕获的同时可通过网络传播和播放,支持视频与音频在捕获和播放中的完全同步,支持来自不同媒体源数据捕获的合成等。本文着重介绍如何利用VisualC++实现基于DirectShow的视频和音频捕获以及其中涉及到的关键问题,以供工程人员和开发人员参考使用。DirectShow的原理1、 DirectShow的体系结构。应用程序与DirectShow组件以及DirectShow所支持的软硬件之间的关系如图1所示。DirectShow使用模块化的架构,系统中的基础模块称为过滤器(Filter)。过滤器作为软件的组件,可完成单一的数据流处理功能。按照功能,过滤器大致分为3类:源过滤器(SourceFilter)、转换过滤器(TransformFilter)和表现过滤器(RenderingFilter)。源过滤器负责从媒体源获取数据;转换过滤器负责数据的格式转换、传输,如数据流分离/合成、编码/解码等;表现过滤器负责数据的最终去向,将数据送往显卡和声卡进行播放,或输出到文件进行存储。过滤器之间通过引脚(Pin)进行有序连接,组合而成过滤器图(FilterGraph),用以实现组合的一系列功能。应用程序创建过滤器图管理器(FilterGraphManager),负责过滤器图的组织和连接功能并控制数据在其中的流动。为了提高系统的稳定性,Windows操作系统对硬件操作进行了隔离;应用程序一般不能直接访问硬件。过滤器工作在用户模式(Usermode,操作系统特权级别为Ring3),而硬件工作在内核模式(Kernelmode,操作系统特权级别为Ring0)。2、 DirectShow的开发方法。开发DirectShow应用程序,主要有以下三个基本步骤:(1)调用CoCreateInstance函数,创建一个过滤器图管理器组件;根据项目实际需求,构建一条完整的过滤器链路(也可应用其它的DirectShow帮助组件来完成过滤器图的构建);调用过滤器图管理器上的接口方法来控制过滤器图,并完成过滤器图管理器与应用程序的事件交互。DirectShow技术建立在COM(ComponentObjectModel)技术基础上,所有部件和功能都可由COM接口来构建和实现。过滤器图管理器的重要COM接口包括:IGraphBuilder:用于创建过滤器图。IMediaControl:用于控制媒体流在过滤器图中的传输。IMediaEventEx:用于控制过滤器图的事件。IVideoWindow:用于设置多媒体播放窗口的属性。IBasicAudio:用于控制音频特性。IBasicVideo:用于控制视频特性。IMediaPosition:用于查找和定位数据流。IPin:用于管理两个过滤器之间的引脚,从而连接过滤器。另外,由于直接使用IGraphBuilder接口构建视频和音频捕获过滤器图比较复杂,DirectShow提供了辅助组件 捕获图构建器(CaptureGraphBuilder),通过调用其IcaptureGraphBuilder2的接口方法,可以简便地完成过滤器图的构建和控制。基于DirectShow视频和音频捕获的实现1、 编译环境的设置。安装MicrosoftDirectXSDK后,需要设置VC编译环境。包括:在VC系统目录中添加DirectXSDK的Include和Lib目录;创建工程,选择Win32动态库;选择_stdcall函数调用协议;添加已编译基类源代码生成的库Strmbase.lib(发布版)或Strmbasd.lib(调试版)。2、 过滤器图的构建设计。捕获系统需要实现的功能:从视频采集设备和音频采集设备实时获取数据流,预览视频和监听音频,并将视频流与音频流合成后存储。设计如图2所示的过滤器图,各个过滤器组件功能:VideoCapture和AudioCapture分别负责实时捕获视频和音频;VideoRenderer将视频流送往显卡进行视频预览;SmartTee负责音频流的分流;AVIMuxer将视频流与音频流合成AVI流,FileWriter将合成后数据存储在硬盘;AudioRenderer将数据送往声卡进行音频播放。需要说明的是,一般视频捕获器提供有预览和捕获两个输出引脚,而音频捕获器只有捕获输出引脚。对于只有捕获输出引脚的视频捕获器也可使用插入SmartTee的方法实现数据分流。3、 程序实现。在这一部分,分析和说明捕获功能的实现步骤,并给出核心代码:(1)创建过滤器图管理器组件。CoInitialize(NULL);//初始化COM库//创建过滤器图管理器IGraphBuilder*pGraphBuilder;CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void**)&pGraphBuilder);//创建捕获图构建器ICaptureGraphBuilder2*pCapGraphBuilder;CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pCapGraphBuilder);pCapGraphBuilder->SetFiltergraph(pGraphBuilder);//添加捕获图构建器到管理器中//获得有用接口IMediaControl*pControl;IMediaEventEx*pEventEx;pGraphBuilder->QueryInterface(IID_IMediaControl,(void**)&pControl);pGraphBuilder->QueryInterface(IID_ImediaEventEx,(void**)&pEventEx);(2)创建捕获过滤器。//枚举采集设备ICreateDevEnum*pCreateDevEnum=NULL;CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void**)&pCreateDevEnum);//创建设备枚举器IEnumMoniker*pVideoEnumMoniker=NULL;pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pVideoEnumMoniker,0);//指定类型目录/*以枚举视频设备为例。枚举音频设备与此类似,代表音频采集的过滤器注册为CLSID_AudioInputDeviceCategory类型*/IMoniker*pVideoMoniker=NULL;IPropertyBag*pVideoPropBag;pVideoMoniker->BindToStorage(0,0,IID_IPropertyBag,(void**)(&pVideoPropBag));//枚举设备标识VARIANTvarVideoName;VariantInit(&varVideoName);pVideoPropBag->Read(L"VideoFriendName",&varVideoName,0);/取/得设备的友好名称/创建VideoCaptur过滤器IBaseFilter*pVideoCap;pVideoMoniker->BindToObject(0,0,IID_IbaseFilter,(void**)&pVideoCap);/添加VideoCaptur过滤器到过滤器图pGraphBuilder->AddFilter(pVideoCap,L"VideoCaptureFilter");构建其它过滤器,并加入过滤器图。/*ICaptureGraphBuilde提供了RenderStream函数,可以自动构建SmartTee和Renderer过滤器,并将它们连接成一个完整的过滤器图。如果Capture过滤器既有预览引脚又有捕获引脚,那么RenderStream)将两个引脚和Render过滤器连接;如果Caprtur过滤器只有捕获引脚,那么捕获图构建器自动插入SmartTeeS滤器将视频流或音频流分流,并完成过滤器之间的连接。*///构建视频预览的过滤器链路IBaseFilter*pVideoCap;//pCapGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pVideoCap,NULL,NULL);//构建音频监听的过滤器链路IBaseFilter*pAudioCap;pCapGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Audio,pAudioCap,NULL,NULL);//构建视音频合成并保存文件过滤器链路/*SetOutputFileNam函数会自动创建AVIMuxer过滤器和FileWrit过滤器,并且将这两个过滤器添加到过滤器图中。*/IBaseFilter*pMux;pCapGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,L"C:\\Capture.avi",&pMux,NULL);/连接捕获器和AVIMuxer过滤器pCapGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pVideoCap,NULL,pMux);pCapGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Audio,pAudioCap,NULL,pMux);//设置音频流为主流IConfigAviMux*pConfigAviMux;pMux->QueryInterface(IID_IConfigAviMux,(void**)&pConfigAviMux);pConfigAviMux->SetMasterStream(1);控制过滤器图pControl-〉Run()开/台捕获pControl-〉Pause(暂停pControl-〉S

温馨提示

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

评论

0/150

提交评论