DirectShow视频捕捉应用研究

摘要 本文将对从捕捉设备和从播放文件中进行视频捕捉涉及的有关驱动(Driver)与应用的模型和接口进行研究和分析,比较其Windows与Windows CE中的不同,从而提出在Windows CE下实现视频捕捉数据流的方法。

  关键字 DirectShow,视频捕捉,驱动,Windows CE系统

  引言

  随着多媒体技术的不断发展,相应的软件与硬件层出不穷,现在与多媒体视频会议(Video Conference)、视频对话相关的软硬件正成为人们关注和谈论的热点应用。而在这些应用中无不涉及视频数据的捕捉。

  视频捕捉

  1、从工具上讲:一般从宏观上我们讨论的视频捕捉都是指的我们依赖于一定的软件和硬件快速获取和处理音/视频数据,实现照相、抓图、字幕、视频翻转/镜像等操作。

   视频捕捉硬件一般有:视频捕捉卡、摄像头(CAMERA)、摄像机或称摄影机(DV)等;

   视频捕捉软件是指相应捕捉硬件的驱动程序和实现捕捉、回放功能的应用软件。如:HyperCam,iuVCR ,WinCAM 2000 等。

  2、静态和动态视频捕捉

   静态视频捕捉成的一般为图片文件,如.BMP的文件等,其分辨率的大小可以通过程序或设备属性设定。

   动态视频捕捉的可以是.WAI等具有连续动作的视频低自定格式的文件,用一般的播放软件可以播放。

基于DirectShow的视频捕捉过程

  1、DirectShow技术

  在一般的软件开发工具中(比如VB,VC)都可以直接调用windows系统下的MCI控制接口)函数或者媒体播放控件(WMP等),设定相关的文件名等属性就可以实现视频的捕捉或回放。随着多媒体技术的迅速发展,各种压缩算法在该领域的应用,MCI技术越来越显的力不从心,最明显的是它不支持可变比特率的压缩算法,对于处理DVD等近年出现的多种新的媒体格式已显得无能为力。随后,微软又适时推出了建立在DirectX(包含DirectDraw、DirectSound、Direct3D)之上的DirectShow技术,它也是一种API(应用程序接口),每个DirectX部件都是用户可调用的API的总和,通过它应用程序可以直接访问计算机的硬件。支持来自本地或网络的各种视频、音频压缩格式的媒体文件的解码和回放,可以从设备上捕捉多媒体流,也可以处理各种压缩算法处理的流媒体。这些格式包括:MPEG的音频和视频标准、音频和视频交互标准(AVI)、WAVE、MIDI和高级流格式ASF。

  DirectShow包含了三种标准COM组件(一般称为过滤器—Filter):Source filter、Transform filter、Renderer filter来处理流媒体数据。Filter带有输入、输出针角(pin),或二者兼而有之。Filter通过向文件读写、修改数据和显示数据到输出设备上来操作流媒体。为了完成整个任务,必须要将所有的Filter连接起来,这三种Filter组成了过滤器图表管理器(Filter graph manager),如图1所示:


图1 过滤器图表结构(Filter Graph Manager)

  从图1中可以看出,Filter graph manager是各种过滤器的集合,它是通过各Filter的输入输出"pin"顺序连接而成的,这些Filter的pin通过协商来决定它们将支持何种形式多媒体。

  2、从视频设备进行的视频捕捉

  在DirectShow的filter中,有一类Capture Filter,它一般代表的是捕捉卡等硬件设备,其实它就是DirectShow与设备的Driver之间的接口。因为Filter通过DeviceIoctl函数实现交互,使得应用程序员可以通过DirectShow的Filter直接与捕捉设备的Driver进行通信。
其模型如图2:


图2视频捕捉体系(VideoCaptureAchitecture)

  我们只需将Capture Filter加入Filter Graph中,在通过其提供的接口函数就可以捕捉我们需要的视频或音频数据。

  3、在媒体播放过程中的视频捕捉

  Sample Grabber Filter是Transform filter的一种,它提供了一些接口能够检索(retrieve)在Filter Graph中传递的数据样本(samples),从而实现对播放过程中数据流的控制。比如通过IsampleGrabber::GetCurrentBuffer就可以得到当前的图像帧,进而将其保存为文件或者显示在指定的地方。

  开发人员也可以通过编写自己的Filter来扩展DirectShow对媒体的支持功能,例如:在微软的DirectX技术中不提供MPEG2 Decoder Filter,换句话说,必须提供第三方的MPEG2 Decoder,这个“第三方的MPEG2 Decoder Filter”就是必须我们自己编写或者从别的厂商处购买;其中就包括Video/Audio Decoder Filter。有很多软件厂商就是经营这种产品的。
应用设计

  当视频捕捉卡正确安装到系统中后,我们就可以使用代表捕捉卡的那个Capture Filter。如图3:


图3

  1、Capture Filter的创建也不象其他Filter一样使用CoCreateInstance就可以,而是先创建一个系统设备(System Device Enumerator)枚举器,从中选择代表Capture设备的Capture Filter;然后与添加别的Filter一样调用IFilterGraph::AddFilter就可以将Capture Filter加入Filter Graph。

  2、上一步之后,剩下的Filter使用ICaptureGraphBuilder2接口依次连接到Filter Graph中,最终形成一个完整的Filter Graph Manager。要实现视频捕捉到文件,可用ICaptureGraphBuilder2::RenderStream方法,指定相应的输出文件路径等参数即可。

  3、要具体细致的话,还可以在Filter Graph链路中加入Crossbar Filter(用于选择捕捉卡或捕获设备的输入端子,一般有三种:AV、S-Video、TV)。它的加入方法与Capture Filter类同。

   在Windows CE中的思考与设想

  就像Windows CE的Win32 API只是Windows的Win32 API的子集一样;Windows CE中的DirectX SDK没有Capture Filter 这类代表Capture Device的Filter,也没有ICaptureGraphBuilder,要进行视频捕捉,只有自己手动配置DirectShow application各项元素用于媒体捕捉。这就需要一个Source filter从Driver中接收原始(Raw)数据,即让Raw data=>Source filter=>Encoder(decoder)=>File writer这样进行捕获。但是Windows CE中并没有自带有这样支持媒体捕捉的Source Filter和File writer。所以我们必须从底层的Driver入手,分析他们之间的关系和接口。从而为我们编写Source Filter和File Writer提供线索。

  在DirectShow中都提供了一种叫ksproxy的代理Filter,它代表了各种类型的WDM 流设备,硬件制造商(IHV)们通过扩展这中Filter,封装为一种叫ksproxy plug-in的COM对象(通常实现的是与下层驱动的流接口即是一种Stream Interface)来提供特定的功能,这些下层通信的实现几乎都包括在我们的Driver中。而对应用程序开发者来说,都可以通过DeviceIoControl和CreateFile函数完成对Driver及设备的控制和访问,并且可以通过RequestDeviceNotifications函数查询和管理设备提供的接口。再根据接口函数实现直接对设备在Driver中的数据流进行控制的目的。其后还可以通过DeviceIoControl和WriteFile对捕捉的数据流进行操作。其中CreateFile的过程可以封装在待开发的Source Filter中,而WriteFile的过程可以封装在File writer中。其目标模型如图4:


图4WDM Video Capture Architecture

   结束语

  本文将对从捕捉设备和从播放文件中进行视频捕捉涉及的有关驱动与应用的模型和接口进行了分析,比较了其Windows与Windows CE中的不同,提出了在Windows CE下实现视频捕捉数据流的方法。从而得出一个结论是:由于现在Windows CE在嵌入式系统中应用越来越广,而它所提供的功能函数肯定没有Windows全,所以我们在遇到类似问题时都应该想到运用系统提供的函数重构自己的函数,并将其模块化、构件化。这必将是软件开发的一个趋势。

  参考文献:

  1、 Microsoft DirectX9 SDK & Microsoft Windows CE .NET 4.2 SDK

  2、 陈向群 王雷 等,Windows CE .NET系统分析及实验教程,机械工业出版社,2003.1

  3、 David J.Kruglineki等,Visual C++ 6技术内幕,北京希望电子出版社 ,1999.5
 

### 回答1: AmCap是一款流行的视频捕捉工具,可用于捕捉计算机摄像头或视频设备的实时视频流。AmCap的源代码是其程序的背后核心,包含了实现这些功能的编程代码。 AmCap源码基于Microsoft DirectShow技术开发,该技术是一套用于多媒体处理的API(应用程序接口)。AmCap源码中的各个模块对应着不同的功能,如视频采集、视频预览、视频录制、参数设置等。开发人员可以通过分析AmCap源码,了解其实现原理和流程,进而进行定制开发和功能扩展。 AmCap源码使用C++语言编写,对于有一定编程基础的开发人员来说,理解和修改源码是可行的。开发人员可以通过阅读源码中的注释和参考文档,深入了解DirectShow的相关知识,并且可以从中学习到视频采集和处理的一些常见操作和技巧。 然而,由于AmCap源码相对复杂,并且直接阅读和修改可能需要较高的编程技术水平,对于初学者来说可能会有一定困难。因此,如果对AmCap功能有特定需求的开发人员,也可以通过调用AmCap提供的接口来实现所需功能,而无需深入研究其源码。 总之,AmCap视频捕捉源码提供了一个学习和定制开发的平台,通过分析和修改源码,开发人员可以深入了解视频采集和处理的内部机制,并实现自己的定制化需求。 ### 回答2: AMCap视频捕捉源码是一个用于录制和捕捉视频应用程序的源代码。AMCap是一款流行的Windows应用程序,可方便地捕获来自摄像头、摄像机和其他视频设备的图像和视频。 AMCap视频捕捉源码提供了实现视频捕获和录制功能的程序代码。该源码可以帮助开发人员理解和学习如何使用Windows API和多媒体框架来控制和处理视频流,从而在自己的应用程序中实现类似的功能。 使用AMCap视频捕捉源码,开发人员可以自定义视频捕捉应用程序,以满足特定的需求和功能。他们可以根据自己的需求修改源码,并添加额外的功能,如视频滤镜、特效和实时预览等。此外,开发人员还可以根据自己的要求优化视频编码和解码算法,以提高视频质量和性能。 使用AMCap视频捕捉源码,开发人员还可以学习如何处理视频流和图像数据,并进行实时分析和处理。他们可以了解视频颜色空间、分辨率、帧率和压缩格式等基本概念,并学习如何在自己的应用程序中实现这些功能。 总之,AMCap视频捕捉源码是一个有助于开发人员理解和学习视频捕捉和录制的源代码,可用于开发自定义的视频捕捉应用程序,并实现各种视频处理和分析功能。 ### 回答3: AMCap是一款常用的视频捕捉应用程序,它可以用于捕捉摄像头的实时视频或从视频设备中获取视频输入。虽然它是一款商业软件,但是由于其流行度,许多人都希望能够获得它的源代码以进行二次开发或自定义。然而,AMCap的源代码并不是公开可用的。 AMCap的源代码是由作者所拥有的知识产权,并且并没有公开发布。这意味着,如果你想要获得AMCap的源代码,你必须与作者进行联系并获得相关许可或协议。作者可能会要求你支付费用以获得源代码的许可证,或者可能拒绝提供源代码的许可。 如果你对视频捕捉应用程序感兴趣,并且想要了解更多相关的技术和源代码,你可以考虑使用其他开源的视频捕捉库或应用程序,如OpenCV或FFmpeg。这些开源库和应用程序提供了丰富的功能和灵活性,并且它们的源代码是公开可用的,任何人都可以自由使用、修改和分发。 总之,虽然AMCap是一款常用的视频捕捉应用程序,但其源代码并不是公开可用的。如果你有兴趣研究视频捕捉应用程序的源代码,可以考虑使用其他开源的库或应用程序,它们提供了更多的灵活性和自定义选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值