- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AMCAP程序详解
AMCAP程序详解
文章原始出处 CSDN 作者 capboy
????DirectShow提供了用应用程序从适当的硬件中捕捉和预览音/视频的能力。数据源包括:VCR,Camera,TV Tuner,Microphone,或其他的数据源。一个应用程序可以立刻显示捕捉的数据(预览),或是保存到一个文件中。
????在这个例子中,ICaptureGraphBuilder 接口是处理捕捉工作的主要接口。你可以在你自己的捕捉程序中使用同样的方法和接口。在这里主要讨论ICaptureGraphBuilder如何执行音/视频的捕捉。我们假设你已经熟悉了DirectShow的filtergraph的体系和一般的capturefilter graph的结构(可以参考DirectShow基础指南)。
????ICaptureGraphBuilder接口提供了一个filter graph builder对象,让你的应用程序在建立capture filter graph时,省去处理很多单调乏味的工作,集中精力于捕捉中。它提供的方法满足了基本的捕捉和预览功能的要求。
????FindInterface方法,在filter graph中查找一个与捕捉有关的详细的接口。使得你可以访问一个详细接口的功能,而不需要你去列举filter graph中的pins和filters。????RenderStream方法,连接源过滤器和渲染过滤器,选择添加一些中间的过滤器。?? ControlStream方法,独立地精确地控制graph的开始和结束帧。
????既然是硬件捕捉,当然要和硬件打交道,接着介绍设备列举和捕捉接口。
????通过ICreateDevEnum::CreateClassEnumerator方法列举捕捉系统中的设备。之后,实例化一个DirectShow的filter去使用这个设备。? 用ICaptureGraphBuilder::FindInterface去获得与捕捉相关的接口指针IAMDroppedFrames, IAMVideoCompression, IAMStreamConfig,以及 IAMVfwCaptureDialogs 。因为设备列举和捕捉接口比较长,放在这会打乱结构,所有专门写了一篇(参考设备列举和捕捉接口)。
NOTE:???这个示例是DirectShow自带的例子。你可以在DirectShow SDK的目录Sample\DS\Caputre看这个例子代码(AMCap.cpp)。这里只是他的一些片断代码。可以说是他的中文模块的说明。AMCap例子中,把所有的接口指针和一些成员变量保存在一个全局结构gcap中了。
????当不在需要保存在gcap中的接口指针是,一定要释放这些接口指针,一般是在程序的析构函数中,或是在别的同等功能函数中。如下:
if (gcap.pBuilder)gcap.pBuilder-Release();gcap.pBuilder = NULL;if (gcap.pSink)gcap.pSink-Release();gcap.pSink = NULL;if (gcap.pConfigAviMux)gcap.pConfigAviMux-Release();gcap.pConfigAviMux = NULL;if (gcap.pRender)gcap.pRender-Release();gcap.pRender = NULL;if (gcap.pVW)gcap.pVW-Release();gcap.pVW = NULL;if (gcap.pME)gcap.pME-Release();gcap.pME = NULL;if (gcap.pFg)gcap.pFg-Release();gcap.pFg = NULL;
设置文件名
???使用普通的OpenFile Dialog获得捕捉文件的信息。通过调用AllocCaptureFile函数为捕捉文件分配空间。这一点是重要的,因为这是个巨大的空间。这样可以提高捕捉操作的速度。ICaptureGraphBuilder::AllocCapFile执行实际的文件分配,IFileSinkFilter::SetFileName 指示file writer filter使用用户选择的文件名保存数据。ICaptureGraphBuilder::SetOutputFileName把file writer filter加入filter graph(后面会介绍,它是ICaptureGraphBuilderd自代的)。
SetCaptureFile 和 AllocCaptureFile 函数如下:
/** Put up a dialog t
文档评论(0)