DirectShow之接口实战篇
directshow资料
深入浅出DirectShow FilterDirectshow 2007-09-13 16:55:14 阅读52 评论0 字号:大中小1. Filter概述Filter是一个COM组件,由一个或多个Pin组成。
Pin也是一个COM组件。
Filter文件的扩展名为.ax,但也可以是.dll。
Filter根据其包含Input pin或Output pin的情况(或在Filter Graph的位置),大致可分为三类:Source Filter(仅有Output pin)、Transform Filter(同时具有Input pin和Output pin)和Renderer Filter(仅有Input pin)。
一般情况下,创建Filter使用一个普通的Win32 DLL项目。
而且,一般Filter项目不使用MFC。
这时,应用程序通过CoCreateInstance函数Filter实例;Filter与应用程序在二进制级别的协作。
另外一种方法,也可以在MFC的应用程序项目中创建Filter。
这种情况下,Filter不需注册为COM组件,Filter与应用程序之间的协作是源代码级别的;创建Filter实例,不再使用CoCreateInstance函数,而是直接new出一个Filter对象,如下:m_pFilterObject = new CFilterClass();// make the initial refcount 1 to match COM creationm_pFilterObject ->AddRef();因为Filter的基类实现了对象的引用计数,所以即使在第二种情况下,对创建后的Filter对象的操作也完全可以遵循COM标准。
Filter是一个独立功能模块,最好不要将Filter依赖于其他第三方的DLL。
因为Filter具有COM的位置透明性特点,Filter文件可以放在硬盘的任何位置,只要位置移动后重新注册。
direct show
写这篇笔记,就当是对这个期间学习DirectShow的一个总结,假如它可以给你带来一些收获的话,那我会感到更高兴。
还有我遇到的一些问题,希望和大家一起讨论。
一、基本概念1.DirectShow概述DirectShow的主要功能是流媒体的采集与回放。
它集成了DirectDraw,DirectSound,Direct3D的一些技术。
它是一个开放的架构,你自己可以写自己的Filter组件。
DirectShow的架构:(这个图太经典了)2.FilterFilter其实就是一个COM组件,但它有自己的特性。
它由输入,处理,输出三部分组成,输入,输出是叫PIN,输入的叫输入pin,输出的叫输出PIN。
PIN也是一.种COM组件,它实现了IPin接口。
在Filter的实现里,PIN其实是Filter的一个数据成员。
(个人想法)(1)Filter分为三类:Source Filter(源过滤器),Transform Filter(转换过滤器)Render Filter(渲染过滤器)(2)Source Filter 的主要负责音、视频数据的采集,读取。
比如File SourceFilter(文件源过滤器),它是从磁盘里的音视文件读取数据的。
Transform Filter 负责音、视数据的压缩,解压,编码、解码、分析。
比如:Spliiter Filter(分离器),其功能是将音频流和视频流分离开来Mux Filter(复合器),将音频流和视频流全成单一数据流还有一此Encoder,Decoder,Compressor等。
(3)Render Filter负责音、视流的渲染,就是和输出,它将数据流送到输出设备,(显示器、磁盘、声卡)。
Filter有三种状态,运行,暂停,停止。
关于数据流:3.Filter Graph(过滤器图)Filter Graph是DirectShow一个基本的概念。
我们开发一个DirectShow应用,其中最重要的步骤就是构造一个FilterGraph。
(MatLab、Labview)通过Directshow接口访问相机参数设置方法
(MatLab、Labview)通过Directshow接⼝访问相机参数设置⽅法DirectShow接⼝访问相机参数设置⽅法本⽂档适⽤于所有适⽤directshow接⼝访问相机的程序,例如MATLAB 和Labview的ImaqDx接⼝、Halcon的Directshow接⼝等。
MATLAB中,可以通过如下界⾯设置相机参数:Labview的NIMAX中可以通过如下界⾯设置相机参数:下⾯以Labview为例,介绍Labview中如何通过ImaqDx接⼝访问迈德威视⼯业相机。
⽬前,我们提供三种⽅式,在Labview中访问我们的相机:1.GigeVision接⼝。
仅我司GigE相机⽀持该⽅式访问。
2.直接基于SDK的DLL⽂件调⽤的⽅式。
该⽅式⽀持我们所有型号相机。
例程在安装⽬录的DEMO/LABVIEW/USEDLL⽂件夹中。
3.通过ImaqDx使⽤Directshow接⼝访问相机。
该⽅式⽀持我们所有型号相机。
Directshow接⼝是windows系统上的⾳视频标准接⼝,定义了⼀些预先约定好的协议,但是由于协议定义时间⽐较早,也没有为⼯业摄像头考虑参数接⼝,所以接⼝的参数配置上,没有像使⽤我们的SDK那样灵活。
我们针对此问题,做了⼀些特殊处理,扩展了Dircetshow接⼝中Camera Atrributes的“White Balance”属性,⽬前可以该⽅式进⾏如下操作:1.设置相机⼯作模式(连续采集、软触发、硬触发)⽅法:在Camera Atrributes中,设置“White Balance”属性的Value值●为0,则相机进⼊连续⼯作模式;●设置为1,则相机进⼊软触发⼯作模式;●设置为2则相机进⼊硬触发⼯作模式。
2.执⾏⼀次软触发⽅法:在Camera Atrributes中,设置“White Balance”属性的Value 值为3,则相机进⾏⼀次软触发,如果要多次软触发,则重复设置“White Balance”属性的Value值为3即可,每设置⼀次,进⾏⼀次软触发。
用directshow开发视频解码插件
7
用 drc h w开 发视 频 解码 插 件 i to es
李 晓静 刘 爱 玉 李 舜 昌 邵 兰英
( 南柴 油 机 股 份有 限公 司 , 南 2 0视 频 回 放 系 统 需 要 专 门 开 发 播 放 软 件 。 文 介 绍 了在 V sa c 十 中 利 用 Di c h w DK 定 传 本 i l + u rto S eS
键 函数 。
关 键 词 : 频 解 码 插 件 视
Di c h w rto eS
视 频 监 控 系统 在实 际 中具 有 广 泛 的应 用 范 围 , 核 心 其
技 术 包 括 视 频 数 据 的 采 集 、 缩 、 输 、 存 与 回 放 。本 文 压 传 保
样, 我们 可 以利用 一 个 .e 文件 方 便 地 描述 需 要 导 出 的函 df
随着 信 息技 术 的发 展 ,多媒 体 技 术 面 临 越来 越 多 的 挑 战 , 发 多媒 体 应用 程 序 愈发 复 杂 。 i c h w的设 计初 开 Dr t o eS
衷 就是 让 应 用 程 序 开 发人 员 从 复 杂 的数 据 传输 、硬 件 差
Dl eCa s betP I A E l t l O jc R V T G s
R ls e ae版 本 ,tn a.b mscti wn m.b e s b 1 、 vr 1 n s i .b、 im 1 i
V 目录之 前 , C 以便 编 译器 使 用最 新 版 本 的源 文件 。
2 2 Fl r 类 的 选 择 . ie 基 t 我 们 的 设 计 主 要 包 括 两 个 核 心 类 ,分 别 是 C ie t Fhr r C 和 C eo eS em, 其 中 , Fhr t控 制 文 件 数 据 的 管 理 , D cd dt a r C ieCr
directshow教程(新整理)
Directshow教程0.11MSDN翻译系列作者:黄丁杰说明:如果有任何问题请联系din-je@。
是本人业余翻译的如果有错误请直接发到我邮箱我会立刻改正,directshow的其他文章我会在以后不断翻译出来。
如果觉得好请帮我作作宣传。
欢迎转载,但是禁止修改。
Directshow起步。
本章主要介绍diirectshow在编写程序时所需的基本概念。
在本章你可以总揽下directshow 技术。
你必须在总体上对本章的编程和媒体有所了解。
本章将介绍。
设置编译环境。
介绍directshow应用程序编程。
如何播放一个文件设置编译环境:你可以编译工程在命令行模式下或者在vs集成环境中头文件所有的directshow应用程序都使用下面的头文件。
Dshow。
H部分directshow接口需要附加的头文件。
这些文件会在接口的注意中给出。
所需的库文件directshow需要如下的库文件strmiidl。
Lib 该库包含CLSIDs和IIDs的接口。
所有的directshow都需要该库。
Quartz。
Lib 该库包含AMGetErrorText函数。
如果你没有调用该函数,该库没有用。
记住在你的编译环境中必须把directx SDK 的头文件库和连接库的目录作为vs优先搜索的路径。
这样可以保证编译的时候用的是最新版本的文件。
介绍directshow应用程序编程本章介绍编写一个directshow程序的基本技术和概念,读完本章你就可以写个你自己的directshow的应用程序了。
滤镜和图像滤镜directshow是由被称作滤镜的东西构成的。
滤镜是一个软件包用来执行对多媒体流的一些操作。
比如directshow的滤镜可以读出一个文件从视频捕捉设备获取视频流解码各种各样的多媒体格式,比如MPEG-1S视频。
传输视频和音频到屏幕和声卡。
滤镜几乎完成视频播放所需要的从输入到输出的所有功能。
比如一个MPEG-1的滤镜。
它可以输入MPEG码流然后输出图像帧用于后续显示在directshow程序中只要执行把滤镜连接在一起就可以了。
(MatLab、Labview)通过Directshow接口访问相机参数设置方法
DirectShow接口访问相机参数设置方法本文档适用于所有适用directshow接口访问相机的程序,例如MATLAB 和Labview的ImaqDx接口、Halcon的Directshow接口等。
MATLAB中,可以通过如下界面设置相机参数:Labview的NIMAX中可以通过如下界面设置相机参数:下面以Labview为例,介绍Labview中如何通过ImaqDx接口访问迈德威视工业相机。
目前,我们提供三种方式,在Labview中访问我们的相机:1.GigeVision接口。
仅我司GigE相机支持该方式访问。
2.直接基于SDK的DLL文件调用的方式。
该方式支持我们所有型号相机。
例程在安装目录的DEMO/LABVIEW/USEDLL文件夹中。
3.通过ImaqDx使用Directshow接口访问相机。
该方式支持我们所有型号相机。
Directshow接口是windows系统上的音视频标准接口,定义了一些预先约定好的协议,但是由于协议定义时间比较早,也没有为工业摄像头考虑参数接口,所以接口的参数配置上,没有像使用我们的SDK那样灵活。
我们针对此问题,做了一些特殊处理,扩展了Dircetshow接口中Camera Atrributes的“White Balance”属性,目前可以该方式进行如下操作:1.设置相机工作模式(连续采集、软触发、硬触发)方法:在Camera Atrributes中,设置“White Balance”属性的Value值●为0,则相机进入连续工作模式;●设置为1,则相机进入软触发工作模式;●设置为2则相机进入硬触发工作模式。
2.执行一次软触发方法:在Camera Atrributes中,设置“White Balance”属性的Value 值为3,则相机进行一次软触发,如果要多次软触发,则重复设置“White Balance”属性的Value值为3即可,每设置一次,进行一次软触发。
文件系统驱动编程基础篇之六——DirectShow
文件系统驱动编程基础篇之六——DirectShow一、前略本系列文章为业余编程爱好者而写,仅仅作为初学者的一个借鉴,真正的精华存在于参考资料*中。
知识的积累将经历从薄到厚,再从厚到薄的反复过程,为了打下牢固的基础,请读者务必在阅读本文的基础上花费必要的时间完成参考资料。
参考资料*:1.《Programming Microsoft DirectShow for Digital Video and Television》及其示例代码2.《DirectShow for DirectX 8.1 SDK C++》3. Microsoft® Windows®Software Development Kit Update for Windows Vista™之相关文档及其示例代码4.《DirectShow开发快速入门之慨述》5.《深入解析ATL (A TL Internals Second Edition ——Working with ATL 8)》6.《COM 组件设计与应用(一)起源及复合文件》(/document/viewdoc/?id=1483)阅读基础:少量的COM编程的基础知识,了解如何调用COM组件的方法,最好掌握哪怕一丁点的ATL。
本章目的:了解DirectX组件架构,学习编写简单的DirectShow程序。
二、DirectX与DirectShow首先看下面两段关于DirectX和DirectShow相关内容的摘要:DirectX的第一个版本作为Windows Games SDK发布于1995年9月,它作为Windows API的一部分用以替换Windows 3.1中的DCI和WinGAPI。
ATI的一个开发团队为微软带来了基本的游戏影像技术,微软方面,DirectX由专门的团队负责开发,Eisler 为团队领导,而St. John 和Engstrom则成为主程序设计师。
2005年4月,DirectShow从DirectX移除,加入到Microsoft Platform SDK。
DirectShow的接口去初始化和访问系统的硬件设备
DirectShow的中文资料之设备列举和捕捉接口这篇解释和示例如何通过DirectShow的接口去初始化和访问系统的硬件设备。
代表性的,DirectShow应用程序使用下面类型的硬件。
音/视频捕捉卡音频或视频回放卡音频或视频压缩或解压卡(象MPEG解码器)下面将以AV设备作参考。
如何列举设备包括在DirectShow SDK中的接口,类,和例子提供了音/视频捕捉和回放的功能。
因为文件源过滤器和filter graph manager处理了内在的工作,所有,添加捕捉功能到一个应用程序中,只需添加很少的代码。
你可以通过列举系统硬件设备和得到设备列表完成特别的任务(例如:所有的视频捕捉卡的列表)。
DirectShow自动为win32和Video for Windows 设备实例化过滤器。
要AV设备工作,首先,你必须检测当前系统存在的设备。
ICreateDevEnum接口建立指定类型的列表。
提供你需要的检测和设置硬件的功能。
访问一个指定的设备有三步,详细的说明和代码如下:建立系统硬件设备的列表首先,申明一个列表指针,然后通过CoCreateInstance 建立。
CLSID_SystemDeviceEnum 是我们想建立对象的类型,IID_ICreateDevEnum是接口的GUID。
ICreateDevEnum *pCreateDevEnum ;CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);其次,建立一个特别类型的硬件设备的列表(例如视频捕捉卡)申明一个IEnumMoniker接口,并把他传给ICreateDevEnum::CreateClassEnumerator 方法。
你就可以使用他访问新得到的列表了。
IEnumMoniker *pEnumMon ;pCreateDevEnum->CreateClassEnumerator( [specify device GUID here], &pEnumMon, 0);最后,列举列表直到你得到你想要的设备为止。
Directshow开发笔记
智慧的鱼--------DirctShow SDK 学习笔记
提供了一系列的标准的模块可用于应用开发,开发者也可以开发自己的功能 Filter 来扩展 Directshow 的应用。下面我们用一个例子来说明如何采取 Filter 来播放一个 AVI 的视频文件。 从一个文件读取数据,形成字节流。 (这个工作由源 Filter 完成) 检查 AVI 数据流的头格式,然后通过 AVI 分割 Filter 将视频流和音频流分开。 解码视频流,根据压缩格式的不同,选取不同的 decoder filters 。 重画视频图像,通过 Renderer Filter。 将音频流送到声卡进行播放,一般采用缺省的 DirectSound Device Filter。流程见下图。
所以才想起了要翻译这些东西希望在9状态改变graph中的filter的状态改变应该一致因此应用程序并将状态改变的命令直接发给filter而是将相应的状态改变的命令发送给filtergraphmanager由manager将命令分发给graph中每一个filterseeking也是同样的方式工作首先由应用程序将seeking命令发送到filtergraph管理器然后由其分发给每个filterdirectshow2020开发笔记智慧的鱼irctshowsdk学习笔记1directshow开发笔记翻译个人感觉开发自己的filter还是要对dshow的基类要熟悉一些
1
智慧的鱼--------DirctShow SDK 学习笔记
1 About Directshow 基础
1.1 设置 dshow 的开发环境
如果你用 VC 开发环境,一定要在 Setting 里设置下面的东西 包含头文件 Dshow.h 所有的 dshow 应用必须包含
directshow
(3) SetOutputFileName 这个方法是在对视频进行保存时调用的,可以设置保存文件路径,保存类型(如avi,asf),并会返回一个Mux Filter指针。
它的原型是:HRESULT SetOutputFileName( const GUID *pType, LPCOLESTR lpwstrFile, //文件保存位置 IBaseFilter **ppf, //返回一个Mux Filter指针 IFileSinkFilter **pSink //这个指针用来更改文件保存路径,如果不需要可以置为NULL);pType 可能是一个subtype,当它是subtype时,只能下面两种取值:MEDIASUBTYPE_Avi(保存为Avi格式),MEDIASUBTYPE_Asf(保存为Asf),因为这两种格式是windows可以识别的,所以它自动返回一个Mux Filter指针,如果要保存为其它格式,那么要将pType这个参数指定为一个Mux Filter或一个File Writer的GUID。
6)IVideoWindow(控制视频窗口) //接口方法:put_MessageDrain
7)IMediaEventEx(事件处理有关的)
8)IMediaSeeking(用于媒体播放定位的)
上面这些接口,都是通过Filter Graph Manager暴露出来的,我们只创建一个Filter Graph Manaer 组件,就可以它们
( 可以看出TFilterGraph是个Filter的容器 )
按照功能来分,Filter分为三类:Source Filter(源过滤器),Transform Filter(转换过滤器) Render Filter(渲染过滤器)
Source Filter 的主要互责音、视频数据的采集,读取。比如File Source Filter(文件源过滤器),它是从磁盘里的音视文件读取数据的。
DirectShow学习指南之数据流结束通知 net 电脑资料
DirectShow学习指南之数据流完毕通知 net 电脑资料当一个源filter完毕发送数据流时,它调用和它连接的filter的输入pin的IPin::EndOfStream,然后下游的filter再依次通知与之相连的filter,当一个源filter完毕发送数据流时,它调用和它连接的filter的输入pin的IPin::EndOfStream,然后下游的filter再依次通知与之相连的filter。
当EndOfStream方法一直调用到rendererfilter的时候,最后的一个filter就给filter图表管理器发送一个ECPLETE事件通知。
如果renderer有多个输入pin,当所有的输入pin都接收到end of stream通知的时候,它才会给filter图表管理器发送一个ECPLETE事件通知。
Filter必须在其他函数调用之后调用EndOfStream函数,比方IMemInputPin::Receive.。
在一些情况下,下游的filter可能比源filter更早的发现数据流的完毕。
在这种情况下,下游filter发送完毕stream的通知,同时, IMemInputPin::Receive函数返回SFALSE直到图表管理器停顿。
这个返回值提示源filter停顿发送数据。
对ECPLETE事件的缺省处理缺省的情况下,filter图表管理器并不将ECPLETE事件通知发送给应用程序,当所有的数据流都发送了ECPLETE事件通知后,它才给应用程序发送一个ECPLETE事件通知。
所以,应用程序只有在所有的数据流停顿的时候才能接收到这个通知。
filter图表管理器通过计算支持seeking接口的filter,并且具有一个renderer pin,没有相应的输出pin,就可以确定数据流的数目。
Filter图表管理器通过下面的方法来决定一个pin是否是个renderer 。
1、pin的IPin::QueryInternalConnections方法通过nPin参数返回0;在拉模式下的数据流完毕通知在IAsyncReader连接中,源filter并不发送数据流完毕的通知,相应的发送数据流完毕的通知是有renderer filter发出的。
DirectShow使用大全
DirectShow使用大全一.使用directshow时应该添加lib文件Strmiids.lib、Quartz.lib 、Strmbase.lib 具体添加那个见下面的说明Header FilesAll DirectShow applications use the Dshow.h header file. Some DirectShow interfaces require additional header files. These requirements are noted in the interface reference.Library FilesThe following table shows the library files DirectShow uses.Library file DescriptionQuartz.lib Exports the AMGetErrorText function. If you do not call this function, this library is not required.Strmbase.lib If you do not use the DirectShow base classes, this library is not required. For information about the difference between Strmbase.lib and Qtzbase.lib, see Building DirectShow Filters Strmiids.lib Exports class identifiers (CLSIDs) and interface identifiers (IIDs). All DirectShow applications require this library.In your build environment, the SDK Include and Lib directories should be the first directories in the search path. This ensures that you are using the most recent versions of these files.二DirectShow初探可能到现在为止,还没有哪个玩过游戏的人没有接触过Microsoft的DirectX 的。
DirectShow重要接口
DirectShow重要接口第一篇:DirectShow重要接口DirectShow重要接口DirectShow 的重要接口DirectShow采用了COM标准,所以很多重要的功能都是通过COM接口来完成。
下面就列举一些重要的DirectShow的接口。
(1)IGraphBuilder接口用于构造Filter Graph的接口,建立和管理一系列的Filter,过滤和处理源媒体流。
(2)IMediaControl接口用于控制多媒体流在过滤器图表中的流动,如流的启动和停止。
(3)IMediaEvent接口用于捕获播放过程中发生的事件,并通知应用程序,如EC_COMPLETE等。
(4)IVideoWindow接口用于控制视频窗口的属性。
(5)IMeadiaSeeking接口用于查找媒体的接口,定位流媒体,控制多媒体数据播放提供精确控制。
(6)IBaseFilter接口从ImediaFilter接口继承,用来定义一个具体的过滤器指针,并对多媒体数据进行处理。
(7)IPin接口用于管理两个过滤器之间的Pin,从而连接过滤器。
(8)IsampleGrabberCB接口是Sample Grabber过滤器的一个接口,用于当流媒体数据通过过滤器时进行采样以获得帧图象。
用DirectShow来使用摄像头,一般要求摄像头的驱动是WDM 格式的,当然,一些比较老的驱动格式DirectShow也可支持。
在DirectShow中,有一个Sample Grabber过滤器,它是一个可以被插入流的过滤器,它有自己的缓冲,存放采样。
我们就可以用它来从一个视频文件中简单的扑获一桢。
DirectShow通过图形过滤管理器(Filter Graph Manager)来与上层应用程序和下层的驱动进行联系。
DirectShow通过捕获过滤器(Capture Filter)来支持对摄像头的捕获,一个捕获过滤器有多个插口(pin),其中的预览(preview)插口可用来进行显示祯图象。
DirectShow设置亮度、对比度等属性
DirectShow设置亮度、对比度等属性DirectShow设置亮度、对比度等属性分类:DirectShow2008-04-10 10:47 534人阅读评论(0) 收藏举报在DirectShow,对很多设置可以通过IAMVideoProcAmp接口设置亮度、对比度等属性下面m_pVideo是源设备Filter,IAMVideoProcAmp *pProcAmp = 0;hr = m_pVideo->QueryInterface(IID_IAMVideoProcAmp, (void**)&pProcAmp); if(SUCCEEDED(hr)){long Min, Max, Step, Default, Flags, Val;// 亮度.if( g_Brightness > 0 ){hr = pProcAmp->GetRange(VideoProcAmp_Brightness, &Min, &Max, &Step, &Default, &Flags);if(SUCCEEDED(hr)){hr = pProcAmp->Get(VideoProcAmp_Brightness, &Val, &Flags);Val = Min+(Max-Min)*g_Brightness/100;pProcAmp->Set(VideoProcAmp_Brightness, Val, Flags);}}//对比度if( g_Contrast > 0 ){hr = pProcAmp->GetRange(VideoProcAmp_Contrast, &Min,&Max, &Step,&Default, &Flags);if(SUCCEEDED(hr)){hr = pProcAmp->Get(VideoProcAmp_Contrast, &Val, &Flags);Val = Min+(Max-Min)*g_Contrast/100;pProcAmp->Set(VideoProcAmp_Contrast, Val, Flags);}}//饱和度if( g_Saturation > 0 ){hr = pProcAmp->GetRange(VideoProcAmp_Saturation, &Min, &Max, &Step, &Default, &Flags);if(SUCCEEDED(hr)){hr = pProcAmp->Get(VideoProcAmp_Saturation, &Val, &Flags);Val = Min+(Max-Min)*g_Saturation/100;pProcAmp->Set(VideoProcAmp_Saturation, Val, Flags);}}}。
DirectShow技术的应用研究与开发①
DirectShow技术的应用研究与开发①佚名【期刊名称】《《计算机系统应用》》【年(卷),期】2013(000)006【总页数】4页(P196-199)【关键词】多媒体; 音视频; 应用; DirectShow; Filter Graph Manager; Filter【正文语种】中文随着计算机多媒体技术的快速发展, 多媒体凭借着自身的优势越来越受到广泛关注和应用, 它的出现已经改变了人们传统意义上的工作与生活方式. 计算机多媒体技术是处理文字、数据、图像、声音、视频等信息的技术, 其中数据压缩和编码技术、媒体同步技术、多媒体网络技术等是多媒体发展需要的关键技术[1], 技术性强、难度高, 给广大多媒体应用开发人员提出了巨大的挑战.DirectShow为在Windows平台上处理各种媒体文件的回放、音视频采集等高性能要求的多媒体应用提供了完整的解决方案[2]. 本文利用Visual Studio开发工具, 结合DirectShow特点, 阐述了一般音视频处理软件的开发过程.1 DirectShow简介DirectShow是Microsoft媒体开发 DirectX中的一部分, 是Microsoft公司提供的一套在Windows平台上进行流媒体处理的开发包. 采用 DirectShow技术, 我们可以便捷地从音视频采集设备上捕获数据, 并且进行相应的后期处理. 它支持多种媒体格式, 包括Avi、Asf、Mpeg、Dv、Mov、Wave等等. 此外, DirectShow还集成了 DirectX 其它部分(如 DirectDraw、DirectSound)的技术, 直接支持DVD的播放、视频的非线性编辑以及与数字摄像机的数据交换等[1-3].2 DirectShow工作原理2.1 DirectShow系统框架DirectShow系统框架为多媒体应用开发提供了一种标准, 该框架封装了大量的基本组件和各类应用案例, 简化了多媒体应用开发流程. 应用程序与DirectShow系统以及DirectShow所支持的软件、硬件之间的关系如图1所示.图1 系统框图DirectShow主要由Filter Graph构成, Filter Graph中包含了各种 Filter, 这些Filter在 Filter Graph Manager的统一控制下, 按一定顺序连接在一起, 从而使数据在由Filter组成的链表中流动[4], 图1中的箭头表示Filter链表中的数据流的方向.在DirectShow系统框架外, 是与用户直接交互的应用程序. 应用程序要根据实际的功能需求引入相应的 Filter, 建立 Filter Graph, 然后通过 Filter Graph Manager来控制系统的数据处理过程. DirectShow通过事件通知机制, 实现应用程序与Filter Graph Manager之间的交互控制. Filter Graph运行的时候接收到各种事件, 通过消息的方式发送到用户应用程序, 用户应用程序则根据事件类型做出相应的处理.2.2 Filter概述Filter是DirectShow中最基本的概念, 是Filter Graph中最小的功能模块. 对于每个 Filter, 都有其自己特定功能的Pin, Filter通过Pin来进行它们之间的连接. 如图1所示, 按照 Pin输入输出的方向, 一般 Filter分为三类:Source Filters、Transform Filter和 Rendering Filters[5].Source Filters: 源过滤器, 该类Filters引入数据到Filter Graph中, 数据来源可以是文件、设备、网络等,不同的源过滤器处理不同类型的数据源.Transform Filters: 变换过滤器, 该类 Filters获取输入流, 处理数据, 并生成输出流. 变换过滤器对数据的处理包括编解码、格式转换、压缩解压缩等.Rendering Filters: 提交过滤器, 该类 Filters在Filter Graph中处于最后一级, 它们接收数据并把数据提交给外设进行呈现.DirectShow提供了一系列标准的 Filter用以支持基本的应用开发, 开发人员也可以根据实际需要开发自己的功能Filter来扩展DirectShow的应用.2.3 DirectShow对硬件的支持原理DirectShow通过包装 Filter实现对音视频硬件设备的支持, 该类Filter工作在用户模式下, 在内部完成与硬件驱动的交互[5-7], 简化开发人员对硬件的处理.DirectShow集成了很多包装Filter, 其中最重要的是为采用 WDM 驱动模型的硬件设计的 KsProxy Filter(KsProxy.ax). KsProxy.ax能代表各种WDM模型的音视频设备, 对上层调用定义了统一的调用接口,应用程序可控制采集格式、视频参数等.2.4 DirectShow的常用接口DirectShow是基于 COM 标准的应用系统, 大部分功能均通过 COM 接口来完成, 下面是一些常用接口的说明.(1)IGraphBuilder接口用于构造Filter Graph的接口, 建立和管理Filter;(2)IMediaControl接口用于控制媒体流在Filter Graph的流动;(3)IMediaEvent接口用于捕获播放过程中发生的事件, 并通知应用程序;(4)IVideoWindow接口用于控制视频窗口的属性及显示控制;(5)IMediaSeeking接口用于查找媒体的接口, 定位流媒体, 实现播放进度的精确控制;(6)IPin接口用于管理两个Filter之间的Pin;3 视频监控软件开发下面以一个视频监控软件开发为例说明采用DirectShow进行音视频软件的开发过程. 本例中视频采集设备为一个USB接口的摄像头, 软件开发环境采用Visual Studio 6.0和DirectShow SDK(9.0版本).3.1 搜索本机的视频设备DirectShow使用WDM Video Capture Filter支持WDM采集卡, 使用VFW Capture Filter支持VFW采集卡. 这两类采集卡的 Filter均注册为CLSID_VideoInputDeviceCategory类型, 因此需要通过系统设备枚举来创建, 系统枚举流程如图2所示.图2 系统视频设备枚举过程在枚举过程中存储每个设备的 Friendly Name与设备标识指针 Device Moniker, 方便用户选择不同的设备进行操作. 本例中搜索到设备“USB视频设备”(该设备的Friendly Name).3.2 创建Filter Graph采用 DirectShow提供的辅助组件 Capture Graph Builder来创建Filter Graph, 流程如图3所示.图3 Filter Graph Manager创建过程3.3 获取功能接口对象在Filter Graph Manager创建完成后, 调用该组件的QueryInterfaces接口, 获取并存储 IMediaControl、IMediaEventEx、IBasicVideo、IBasicAudio、IVideoWindow等接口对象. 在多媒体软件中, 利用这些接口对象可以开发出如图像预览、图片快照、音视频播放控制、屏幕控制等具体应用.3.4 Filter链路建立调用Capture Graph Builder组件的RenderStream接口对PIN_CATEGORY_PREVIEW类型的Pin完成后续连接, 代码如下:3.5 视频显示调用IVideoWindow对象进行指定窗口的显示, 调用IMediaControl对象的Run 方法控制Filter Graph开始运行, 代码如下:本软件将上述开发过程的DirectShow部分封装为一个独立的类, 包括Filter Graph Manager的创建、系统设备的枚举以及对设备各种控制接口的操作等, 上层应用程序只需实例化该类的对象, 即可调用该类提供的公共接口, 完成各种控制功能.运行该软件, 选择本机枚举到的视频设备(本例中为“USB 视频设备”), 点击“开始”、“抓图”、“停止”、“屏幕切换”等功能按钮, 可观察到视频预览、即时抓图、停止预览以及屏幕切换等功能. 如下图4所示.图4 视频监控软件功能测试图本文档详细说明了DirectShow的基本操作及视频处理部分的设计. 基于DirectShow对流媒体的强大解决方案, 应用软件还可引入不同的Filter来处理不同的媒体数据流, 实现不同的多媒体应用. 本软件通过引入TV Tuner Filter, 同时完成了模拟电视卡的简单控制. 在软件主界面上选择电视卡的音频设备和视频设备(安装模拟电视卡驱动后, 系统可枚举到模拟电视卡的音频设备和视频设备), 点击“开始”按钮即可播放电视节目. 采用上述设计方法开发的视频监控模块和有线电视模块已成功应用在多媒体调度终端上, 效果良好.4 结语DirectShow开发包实现了多媒体应用的总体框架和底层的操作, 包括对硬件设备的充分支持. 在该框架基础上, 应用程序开发人员能够专注音视频采集、多媒体播放、视频会议、视频监控、智能终端等多媒体应用,不需关注多媒体处理的细节, 较容易开发出具有特色的多媒体应用软件, 不仅可以降低开发成本、缩短开发周期, 还提高了多媒体应用的通用性和扩展性.本文讨论了DirectShow的基本原理, 通过一个视频监控软件的实例描述了采用DirectShow来实现视频预览、抓图、电视播放等功能的开发过程. 随着多媒体技术的发展以及用户需求的多样化, DirectShow技术在多媒体应用领域将有广阔的发展前景.参考文献【相关文献】1 陆其明.DirectShow开发指南.北京:清华大学出版社, 2003.1-15.2 文坤,高胜法.DirectShow程序设计原理及应用.计算机系统应用,2006,15(3):25-28.3 周永刚,张有忱.基于DirectShow与数字减影技术的视频监控系统.计算机系统应用,2009,18(2):92-94.4 谢屈波,王六森,夏定纯.基于 DirectShow 的图像采集的实现.软件导刊,2010,9(6):183-184.5 关一,张新荣,董玉友.基于 DirectShow 的多镜头图像采集系统的设计与实现.电子测量技术,2007,30(6):73-75.6 郑晓曦,刘维.基于DirectShow的无线音视频采集与传输系统的研究.数字技术与应用,20011,12:44-45.7 金钧,刘锦高.基于 DShow 的多路视频实时采集处理系统.信息技术,2011,8:138-140.。
DirectX教程之IDirectDraw2接口
IDirectDraw2接口应用程序使用IDirectDraw2接口的方法来创建DirectDraw的各种对象,并且与系统层变量一起工作。
这部分是关于该接口的函数参考。
IDirectDraw2接口的函数可以分为以下几组:分配内存创建对象设备特性显示模式显示状态杂项设置控制级页面和所有COM接口一样,IDirectDraw2接口由IUnknown接口衍生而来。
IUnknown接口支持以下三种方法:AddRefQueryInterfaceRelease你可以使用LPDIRECTDRAW或LPDIRECTDRAW2数据类型来声明一个指向IDirectDraw或IDirectDraw2接口的变量。
在Ddraw.h头文件中用以下代码声明了这两种数据类型。
typedef struct IDirectDraw FAR *LPDIRECTDRAW;typedef struct IDirectDraw2 FAR *LPDIRECTDRAW2;1.IDirectDraw2::Compact目前,该函数尚未完成,还不能使用。
HRESULT Compact();返回值:如果函数调用成功,返回DD_OK。
如果函数调用失败,返回值可能是下列错误值之一:DDERR_INVALIDOBJECTDDERR_INVALIDPARAMSDDERR_NOEXCLUSIVEMODEDDERR_SURFACEBUSY备注:这个函数将所有位于显卡上的页面内存移动到一块连续的空间,以使剩余的连续内存空间值达到最大。
这个函数在执行时,如果被任何其它的操作打断,该函数失败。
应用程序只有将控制级设为独占模式(exclusive),才能调用这个函数。
快速信息:Windows NT:适用于4.0或更新版Windows:适用于Windows 95或更新版Windows CE:不支持头文件:ddraw.h库文件:ddraw.lib2.IDirectDraw2::CreateClipper创建一个DirectDrawClipper对象。
DirectShow多时间戳
DirectShow是做视音频开发值得借鉴的精华方案,当然原理是简单的,实现是复杂的。
撇开其他不谈,单看视音频同步。
以下我们以视音频有时戳,并假定时戳是正确无误的为前提。
DirectShow以一个IReferenceClock接口来表达时戳和同步,它就是一个时钟。
它的一个方法Adivse可以向这个时钟申请多长的定时。
这个定时可以是周期性的,也可以是一次性的。
IReferenceClock的实现类在申请的时间点触发一个事件,也即是Advise的另一个参数。
IReferenceClock只是一个时钟,它并不进行同步。
它还有一个方法就是获取当前的时刻,GetCurrentTime,别小看这个函数,它和Advise真是配合的天衣无缝。
DirectShow在播放开始,即以GetCurrentTime()获取当前时刻,这就是视音频的同步点。
这个值被Run函数传入各个Filter以表明播放的开始时刻,各Filter予以记录。
当播放一帧视频/一块音频采样,特别对是Render(呈现级,一般都是在这级进行同步),Render级以这帧的时戳加上开始时刻作为这帧的播放绝对时刻,向IReferenceClock申请本帧的播放相对时刻。
开始播放时刻+ 帧时戳- GetCurrentTime() = 申请播放等待时间 //申请定时时间然后DirectShow等IReferenceClock触发这个事件。
上述申请播放等待时间可是小于0,那么,DirectShow认为该帧过期,可以丢弃。
认为过期与否,是你自己的决定,你完全可以对小于0的,采取立即播放(仅对视频)。
DirectShow只有当申请的播放时刻到达并被触发事件时才把该帧视频/音频送出去播放。
原理总结:视频和音频通道首先记录同一个开始时刻,当有帧,则向时钟申请该帧视频/音频的播放时刻,并等待事件,之后才送出去播放。
视音频都参照了同一个开始时间,可以做到视音频同步。
当然,DirectShow中实现IReferenceClock接口的实例很多,包括一个叫ISystemClock的COM接口都实现了IReferenceClock接口。
DirectShow配置
DirectShow配置第一篇:DirectShow配置vs2008下directshow的配置(2009-09-14 16:56:09)转载标签:分类:沧海拾贝directxdirectshowvs2008配置近来由于要做一个流媒体播放器,调研后决定在directshow的框架下做。
在比较老的资料里可以知道:directshow是包含在directx SDK里面的。
这里要强调一点,这是在DirectX 9.0b之前的情况,在9.0c以后,directshow和DirectX就彻底分家了,directshow被移到了windows platform sdk里。
如果你只安装了DirectX9.0b之后的版本,是没有directshow的。
我的安装目录是C:Program FilesMicrosoft DirectX SDK(December 2005)。
安装好了后,找到C:Program FilesMicrosoft DirectX SDK(December 2005)SamplesC++DirectShowBaseClasses下的baseclasses.sln,打开后可能会提示转换,注意留下备份。
编译通过后会生成strmbasd.lib,在debug或者release目录下(取决于你程序生成的版本),第一步工作就结束了。
如果编译的时候出现错误,一般是一些变量定义方面的错误,VS2k8不支持默认int定义,也就是说你如果不指定一个数据的类型,编译器会生成一个错误。
而directshow里的sample代码很多都是基于VC6版本的老代码。
总之根据编译器的提示把变量类型声明添上就行了,不难。
第一步工作完成后,就可以开始用directshow了。
下面是使用前的准备工作。
1.首先,点击工具->选项->项目和解决方案->VC++目录。
如图添加两个引用: C:Program FilesMicrosoft DirectX SDK(December 2005)SamplesC++DirectShowBaseClassesC:Program FilesMicrosoft DirectX SDK(December 2005)Include 注意:请将C:Program FilesMicrosoft DirectX SDK(December 2005)替换为你安装directX所在的目录。
DirectShow插件使用手册
DirectShow插件使用手册【摘要】本文档介绍了DirectShow连接相机时的插件使用,通过本套插件可连接海康的工业相机。
一、环境配置1.相机环境配置打开MVS,若PC与相机不在同一网段,则配置IP,设置好相机参数。
确保相机能在MVS上正常取流。
2.注册和注销插件在客户端MVS安装完成后,不会默认注册此插件,需要用户手动用管理员权限运行register.bat脚本注册此插件,插件脚本存放在Development\ThirdPartyPlatformAdapter\DirectShow文件夹内。
可用graphedt.exe程序查看是否注册成功,插件注册在Video Capture Source项内,如图1。
图1用管理员权限运行unregister.bat文件可注销已注册的DShow插件。
3.环境检测(1)在graphedt.exe程序中打开菜单Graph-Insert Filters…;(2)在Video Capture Source项内选择MvCamera DirectShow Source;(3)选中MvCamera DirectShow Source并右键打开Filter Properties…进行相机选择和参数获取和设置等操作,如图2;(4)在DirectShow Filters中选择Video Renderer,并将Video Out与Input相连接,如图3;(5)菜单Graph-Play进行预览;图2 属性页图3 连接页二、参考示例提供DirectShowDisplay示例程序供用户参考,对示例做简要介绍:DirectShowDisplay示例为控制台程序,路径为Development\Samples\DirectShow\DirectShowDisplay,支持Render播放。
在头文件MvDSSource.h内列出相机列表获取、参数获取、参数设置等接口供外部调用。
此示例程序可编译x86和x64版本,分别对应插件的x86和x64版本。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在正确安装好DirectX SDK后,我们必须设置DirectX SDK的头文件和库文件,使其在Visual Studio的搜索路径内。
对于Visual Studio .NET 2003可如下进行设置:菜单→工具→选项→项目→VC++目录,在包含文件中加入D:\DXSDK\Include,在库文件中加入D:\DXSDK\lib(我的SDK的安装路径是D:\DXSDK):头文件文件名称描述Dshow.h所有的DirectShow应用都必须包含库文件文件名称描述Strmiids.lib此库文件中导出类标识(CLSID)和接口标识(IID),所有的DirectShow应用都必须包含此文件。
Quartz.lib此库文件中导出函数AMGetErrorText,如果你的程序中调用了此函数,则必须包含此库文件。
DirectShow之接口实战篇(一)现今自己编程做一个多媒体播放工具是一件很令人开心愉悦的事情,但如果使用MediaPlay 控件开发则会受到很多限制,自己的很多好的创意想法都无法或者很难实现,如果利用微软的DirectX接口开发则可以充分的将作者的独特想法付诸于实现,何乐而不为呢!!不过关于DirectShow接口的开发说明文档实在是少之又少,仅有的一些不是英文的就是一些关于理论方面的,真正关于接口实战编程而且是用Delphi开发工具实现的更是凤毛麟角,使很多人都望而却步。
在这里,我把我应用Directshow开发的心得以及我搜集到一些资料重新整理编辑出来公布,希望对所有由此兴趣的同仁有所帮助,就算达到了我的目的。
废话少说,进入正文。
既然是接口实战篇,就先把一些常用的接口列出来,让大家有一些基本的认识,都是用来做什么的,什么时候我们会需要用到此接口。
IFilterGraph 过滤通道接口IFilterGraph2 增强的IFilterGraphIGraphBuilder 最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph ManagerIMediaControl 用来控制流媒体,例如流的启动和停止暂停等,播放控制接口IMediaEvent 播放事件接口,该接口在Filter Graph发生一些事件时用来创建事件的标志信息并传送给应用程序IMediaEventEx 扩展播放事件接口IMediaPosition 播放的位置和速度控制接口(控制播放位置只能为设置时间控制方式)IMediaSeeking 另一个播放的位置和播放速度控制接口,在位置选择方面功能较强.设置播放格式,多种控制播放方式.常用的有:(1)TIME_FORMAT_MEDIA_TIME单位100纳秒。
(2)TIME_FORMAT_FRAME按帧播放IBasicAudio 声音控制接口IBasicVideo 图像控制接口(波特率,宽度,长度等信息)IVideoWindow 显示窗口控制接口(有关播放窗口的一切控制,包括caption显示,窗口位置控制等)ISampleGrabber 捕获图象接口(可用于抓图控制)IVideoFrameStep 控制单帧播放的接口好了,熟悉了应用DirectShow应用开发常用的接口后,我们就通过一个实例媒体播放器来熟悉掌握这些接口,实例的代码虽然简单,但五脏俱全,功能强大,同时也了解一下应用DirectShow开发一般常用的步骤。
附2:EC_ACTIVATE 视频窗口被激活或者转为非激活状态EC_BUFFERING_DATA 过滤图形包含缓冲数据EC_CLOCK_CHANGED 参考时钟被改变EC_CLOCK_UNSET 时钟提供者被断开EC_COMPLETE 所有数据被渲染完毕EC_DEVICE_LOST 一个即插即用设备被移除或者变为有效.EC_DISPLAY_CHANGED 显示模式被改变EC_END_OF_SEGMENT 到达段的末尾.EC_ERROR_STILLPLAYING 一个异步命令失败EC_ERRORABORT 一个操作被放弃EC_EXTDEVICE_MODE_CHANGE 不支持EC_FULLSCREEN_LOST 一个视频渲染窗口被切换出全屏模式.EC_GRAPH_CHANGED 过滤器图被改变EC_LENGTH_CHANGED 源的长度被改变.EC_NEED_RESTART 过滤器请求过滤图重新开始.EC_NOTIFY_WINDOW 通报一个视频渲染窗口的过滤器EC_OLE_EVENT 过滤器传递一个字符串给应用程序。
.EC_OPENING_FILE 过滤图打开一个文件,或者已经完成了打开文件操作EC_PALETTE_CHANGED 视频调色板被改变.EC_PAUSED 一个暂停请求被处理.EC_QUALITY_CHANGE 过滤图为了质量控制丢桢EC_REPAINT 一个视频渲染器要求重绘.EC_SEGMENT_STARTED 一个新段开始EC_SHUTTING_DOWN 过滤器图被关闭EC_SNDDEV_IN_ERROR 一个音频设备的输入引脚错误.EC_SNDDEV_OUT_ERROR 一个音频设备的输出引脚错误.EC_STARVATION 过滤器没有得到足够的数据.EC_STATE_CHANGE 过滤器图状态改变EC_STEP_COMPLETE 一个过滤器执行了单桢渐进EC_STREAM_CONTROL_STARTED 流控制开始命令产生效果.EC_STREAM_CONTROL_STOPPED 一个流控制的停止命令产生效果EC_STREAM_ERROR_STILLPLAYING 在流中产生了一个错误,但流还是在运行中.EC_STREAM_ERROR_STOPPED 一个流因错误而停止EC_TIMECODE_AVAILABLE 不支持EC_USERABORT 用户中断回放.EC_VIDEO_SIZE_CHANGED 本地视频尺寸改变.EC_WINDOW_DESTROYED 视频渲染器被销毁,或者从过滤器图中移除.DirectShow之接口实战篇(二)大体说来,一般使用DirectShow接口编程无非3个步骤,初始化接口,利用接口中的控制函数使用控制操作,最后释放接口。
(当然这里假定你已经拥有了directshow.pas等必须单元,如果没有的话请在网上查找或者向我索要)(注:以下变量没有定义,需自己定义使用)1)初始化接口部分首先,需要定义需要使用的接口变量GraphBuilder: IGraphBuilder;MediaControl: IMediaControl;MediaSeeking: IMediaSeeking;MediaPosition: IMediaPosition;MediaEventEx: IMediaEvent;BasicAudio: IBasicAudio;BasicVideo: IBasicVideo;VideoWindow: IVideoWindow;SampleGrabber: ISampleGrabber;VideoFrameStep: IVideoFrameStep;(1)然后需要使用CoCreateInstance函数创建一个Filter Graph Manager 实例,CoCreateInstance(TGUID(CLSID_FilterGraph),nil, CLSCTX_INPROC_SERVER,TGUID(IID_IGraphBuilder),GraphBuilder)因为需要抓图使用IsampleGrabber接口,需要创建SampleGrabber实例,var Filter: IBaseFilter; CoCreateInstance(CLSID_SampleGrabber, nil, CLSCTX_INPROC_SERVER,IID_IBaseFilter, Filter); (2) 调用QueryInterface函数获取来获取指针,好以后操作控制Filter.QueryInterface(IID_ISampleGrabber, SampleGrabber);GraphBuilder.AddFilter(Filter, 'Grabber');GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl);GraphBuilder.QueryInterface(IID_IMediaPosition, MediaPosition);GraphBuilder.QueryInterface(IID_IMediaSeeking, MediaSeeking);GraphBuilder.QueryInterface(IID_IMediaEventEx, MediaEventEx);GraphBuilder.QueryInterface(IID_IVideoFrameStep, VideoFrameStep);GraphBuilder.QueryInterface(IID_IBasicAudio, BasicAudio);GraphBuilder.QueryInterface(IID_IBasicVideo, BasicVideo);GraphBuilder.QueryInterface(IID_IVideoWindow, VideoWindow);当然为了安全起见,可以对以上每个过程进行是否成功判断,给出信息,否则很有可能出现问题找不到头绪。
好了,一切准备成功,就可以进入第三步,开始我们的控制操作了。
(3)通过接口提供的函数开始控制哦,差点忘记一件重要的事情,在上面调用QueryInterface之前,还有两件重要的事情要做,第一,要建立一个Unicode(wide character)字符串,保存文件名。
var _wfile: array[0..MAX_PATH - 1] of wchar;MultiByteToWideChar(CP_ACP, 0, pChar(播放文件名), -1, @_wfile, MAX_PATH);然后需要成功RenderFile才可以控制操作GraphBuilder.RenderFile(_wfile, nil);XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />当然在显示的时候要把显示窗体和控件关连起来,这里需要通过IvideoWindow接口方法,VideoWindow. put_Owner(Edit1.Handle);VideoWindow. put_Windows tyle(DSVIDEO_WINDOW_CHILD_STYLE);VideoWindow.SetWindowPosition(0,0, Edit1.ClientWidth, Edit1.ClientHeight);得到图象的一些必要信息,使用IbasicVideo接口中的方法,一些变量自己定义,BasicVideo.GetVideoSize(VideoWidth, VideoHeight);BasicVideo.get_BitRate(VideoBitRate);BasicVideo.get_AvgTimePerFrame(PerFrame);得到当前文件的总时间以及播放时间,需要使用ImediaSeeking接口方法,MediaSeeking.GetDuration(Duration);//得到总时间MediaSeeking.GetCurrentPosition(CurrentPos);//得到当前播放时间也可以通过IMediaSeeking::SetPositions方法设置开始和结束时间。