DirectShow之接口实战篇

合集下载

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

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接口访问相机参数设置方法

(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开发视频解码插件
自动化 与控制

用 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教程(新整理)

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接口访问相机参数设置方法

(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

文件系统驱动编程基础篇之六——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的接口去初始化和访问系统的硬件设备。

代表性的,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);最后,列举列表直到你得到你想要的设备为止。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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方法设置开始和结束时间。

相关文档
最新文档