实现DirectShow技术开发准备

合集下载

DirectShow之接口实战篇

DirectShow之接口实战篇

在正确安装好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纳秒。

DirectShow开发环境搭建(整理)

DirectShow开发环境搭建(整理)

DirectShow开发环境搭建(整理)directshow配置1. 下载安装 DirectX 9.0 SDK Update (February 2005) Extras。

2. 配置IDE环境中的include, lib路径 这步是为了以后更⽅便的做DSHOW开发,不⽤每次对每个⼯程都添加路径。

我的系统是32位win7+VS2010,需要到C:\Users\chef\AppData\Local\Microsoft\MSBuild\v4.0(chef是我的⽤户名)⽬录下修改er.props,这是⼀个XML⽂件,在节点IncludePath和LibraryPath分别添加上dshow sdk的include和lib路径就⾏了,不同路径间⽤分号隔离。

3. 编译baseclass 应该是对dshow的⼀个简单封装吧,据说⽤它开发⽐较⽅便。

到DirectX 9.0 SDK Update (February 2005) Extras\DirectShow\Samples\C++\DirectShow\BaseClasses下编译该⼯程。

貌似会出现⼀些for循环内定义变量的作⽤域、static定义变量省略了int类型等⼩问题,⼤家对照着错误提⽰修改⼀下就好了。

这⾥⽽外说⼀句,开源的东西拿过来⽤往往都会出现⼀些问题,这时不要⼼烦,不要急着到处问⼈,到处找⼈帮忙,应该积累看错误、改错误的经验,这也是初学者与有⼀定⼯作经验的程序员之间的⼀个显著区别吧。

4. 编译AMCap AMCap是⼀个通过摄像头采集视频并存成⽂件的⼯程,位置在DirectX 9.0 SDK Update (February 2005)Extras\DirectShow\Samples\C++\DirectShow\Capture\AMCap。

编译前先到项⽬属性的preprocessor definition中把WINVER、_WIN32_WINNT的值修改⼀下,这两个宏定义标志你使⽤的系统型号及版本, windows SDK中会根据这两个宏决定你是否能使⽤⼀些函数,我是改成0X0600了,之后应该就能成功编译了。

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。

Directshow开发的基本技巧

Directshow开发的基本技巧
EC_ERRORABORT表明出现了一个错误。
应用程序可以通知filter graph manager,在某个指定的事件发生时,向指定的窗口发生一个指定的消息。这样应用程序就可以在消息循环中对发生的事件产生反应。
首先定义消息,
#define WM_GRAPHNOTIFY WM_APP + 1
然后向filter graph manager请求IMediaEventEx接口,然后调用IM来设置消息通知窗口
if (SUCCEEDED(hr))
{
hr = pConfig->SetRenderingMode(VMRMode_Windowless);
pConfig->Release();
}
if (SUCCEEDED(hr))
{
// Set the window.
hr = pVmr->QueryInterface(IID_IVMRWindowlessControl, (void**)&pWc);
2如何处理事件通知(Event Notification)
当一个Directshow的应用程序运行的时候,在filter Graph内部就会发生各种各样的事件,例如,一个filter也许发生数据流错误。Filter通过给graph mangaer发送事件通知来和graph通信,这个事件通知包括一个事件码和两个事件参数。事件码表示发生事件的类型,两个参数用来传递信息。
IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&g_pVidWin);
pVidWin->put_Owner((OAHWND)hwnd);

多媒体系统设计实验-DirectShow1

多媒体系统设计实验-DirectShow1

四、媒体格式转换-GraphEdit
用GraphEdit进行媒体格式转换的好处:
任何一种新型的媒体格式,只要它能在Windows系统 中播放,不必等待专门的转换工具就可以自己动于把 它转换成通用的媒体格式(如AVI或MPEG)。 另外,学会了 用GraphEdit转换媒体格式,也有助于加 深对媒体转换的原理及过程的理解。
合成器:AVI Mux 文件写滤镜: File writer(选择要保存的文件)
连接滤镜
点击绿色箭头,则开始转码。 红色方块表示正在转码中
转码之前也可以设置音视 频的编码器的参数,在对 应filter上右键选择属性
转码后用GraphEdit打开avi文件
关பைடு நூலகம்转码的几点说明
合成器也可以使用“Matroska Muxer”或 “DSM Muxer”,不过,用它们输出的文件格 式也相应的变成了MKV和DSM了。 在插入“File writer”文件写滤镜时,会弹出 “请选择此滤镜要使用的输出文件”对话 框,在对话框中要设置好输出文件的路径及 文件名,文件名的后缀则可以根据合成器 的 类型来设置 。
五、将RM/RMVB的音频分离
分离后,保存成wav文件。Graph ||Insert Filters
1.RealMedia Source:载入RealMedia的媒体文件 2.RealAudio Decoder:RealMedia音频解压滤镜 3.WAV DEST:解压后的音源套用此滤镜输出成WAV
不同的解码器filter都可以实 现mp3解码,可以右键选择 属性了解各个filter的特性
推(push)模式
有Splitter的是拉(pull)模式, 没有的则是推模式。
四、媒体格式转换-GraphEdit

DirectShow简易播放器实现指南

DirectShow简易播放器实现指南

DirectShow简易播放器实现指南一、下载及安装DirectX9.0c版本已经将DirectShow分离出去了,下载时请选DirectX9.0b。

详细了解DirectShow性质介绍请看《DirectShow开发指南》一书。

1、使用VC向导生成一个具体项目;2、在VC的菜单中选择Project|Settings|C/C++,在弹出的对话框中的Category中选择Code generation,然后在Calling convention中选择_stdcall;使用多线程语言运行时库,然后在Use run-time library 中,Debug版选择Debug Multithreaded,Release版选择Multithreaded。

(我们学习中用的C++为Debug版)3、配置必要的链接库文件,即在VC的菜单中选择Project|Settings |Link,在弹出的对话框中的Category中选择General,然后在Object/library modules中输入如下代码:Debug版本strmbasd.lib, msvcrtd.lib, winmm.lib (本实验中还需要连接quartz.lib uuid.lib)Release版本strmbase.lib, msvcrt.lib, winmm.lib并且选中Ignore all default libraries。

说明:DirectShow SDK建议,DirectShow应用程序应该至少连接库文件strmiids.lib和quartz.lib。

前者定义了DirectShow标准的CLSID 和IID,后者定义了导出函数AMGetErrorText(如果应用程序中没有使用到这个函数,也可以不连接这个库)。

如果程序里包含了头文件streams.h,则一般库文件还要连接strmbasd.lib、uuid.lib、winmm.lib。

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程序中只要执行把滤镜连接在一起就可以了。

用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开发快速入门之慨述

个filter的方法,这个工作是由filter在内部通过pin来独立完成的, 3、媒体类型 因为Directshow是基于com组件的,就需要有一种方式来描述filter graph每一个点的数据格式,例如,我们还以播放AVI文件为例,数据以 RIFF块的形式进入graph中,然后被分割成视频和音频流,视频流有一系 列的压缩的视频桢组成,解压后,视频流由一系列的无压缩的位图组 成,音频流也要走同样的步骤。
typedef struct _MediaType { GUID majortype; GUID subtype; BOOL bFixedSizeSamples; BOOL bTemporalCompression; ULONG lSampleSize; GUID formattype; IUnknown *pUnk; ULONG cbFormat; [size_is(cbFormat)] BYTE *pbFormat; } AM_MEDIA_TYPE;
图2 音频流播放Graph图
从上面的图表看,每一个filter都一个其他的一个或者两个filter 相连接。两个Filter相连接的连接点也是com对象,我们称为Pin。 Filter通过pin将数据从一个fiቤተ መጻሕፍቲ ባይዱter传递到另一个filter中,从而可以 使数据在由filter组成的链表中流动。图中的箭头表示filter链表中的
图1 DirectShow系统框图 图1 DirectShow系统框图
1、DirectShow的 Filter Directshow是基于模块化,每个功能模块都采取COM组件方式,称 为Filter。Directshow提供了一系列的标准的模块可用于应用开发,开 发者也可以开发自己的功能Filter来扩展Directshow的应用。下面我们 用一个例子来说明如何采取Filter来播放一个AVI的视频文件。 1) 首先从一个文件中读取AVI数据,形成字节流。(这个工作由源 Filter完成) 2) 检查AVI数据流的头格式,然后通过AVI分割Filter将视频流和 音频流分开。 3) 解码视频流,根据压缩格式的不同,选取不同的decoder filters 。 4) 通过Renderer Filter重画视频图像。 5) 音频流送到声卡进行播放,一般采用缺省的 DirectSound DeviceFilter。流程见下图。

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程序中只要执行把滤镜连接在一起就可以了。

DirectShow技术的应用研究与开发①

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.。

VS 2005下DirectShow开发环境的配置

VS 2005下DirectShow开发环境的配置

VS 2005下DirectShow开发环境的配置2011.06.17 收藏[1] 请确保您的机子上已经安装了VS 2005和DirectX 9.0b SDK。

DX9.0 SDK的下载地址就不写了,自己在网上找吧!(我的DX9.0安装在D盘根目录下)[2] 首先编译SamplesC++DirectShowBaseClasses目录下的baseclasses.sln以得到两个库文件(strbase.lib和strmbase.lib)。

以下介绍的主要是如何修改编译中的错误,这也是众多文章中没有叙述的部分。

自己写的,有些啰嗦,请原谅哦!进入DirectShow的安装目录,找到SamplesC++DirectShowBaseClasses,双击baseclasses.sln打开该解决方案。

首先看到的会是Visual Studio的转换向导,不用管它,直接Next到Finish。

点击F5,调试运行,你会见到下面的错误(至少我编译的时候就是这样的结果):1>------ Build started: Project: BaseClasses, Configuration: Debug Unicode Win32 ------1>Compiling...1>dllentry.cpp1>D:Program FilesMicrosoft Visual Studio8VCPlatformSDKincludewinnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'1>D:Program FilesMicrosoft Visual Studio8VCPlatformSDKincludewinnt.h(222) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int1>D:Program FilesMicrosoft Visual Studio8VCPlatformSDKincludewinnt.h(5940) : error C2146: syntax error : missing ';' before identifier 'Buffer'1>D:Program FilesMicrosoft Visual Studio8VCPlatformSDKincludewinnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int1>D:Program FilesMicrosoft Visual Studio8VCPlatformSDKincludewinnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int1>d:DXSDKSamplesC++DirectShowBaseClassesctlutil.h(278) : errorC4430: missing type specifier - int assumed. Note: C++ does not support default-int1>d:DXSDKincludeuuids.h : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss1>Build log was saved at"file://d:DXSDKSamplesC++DirectShowBaseClassesDebug_UnicodeBuildLog. htm"1>BaseClasses - 6 error(s), 1 warning(s)========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped==========没办法,改错。

DirectShow配置

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环境配置
之类的错误。
二.编译后出现的错误:
1、syntax error : identifier 'DWORD_PTR'
如果你安装了Miscrosof Platform SDK, 你也许会看到:
Compiling...
e:directx9samplesc++directshowbaseclasseswxutil.h(53) : error C2061: syntax error : identifier 'DWORD_PTR'
3、“CComPtr< ”怎么用?
CComPtr<ISmbppLongConnectApiEx> m_spApi;在控制台程序中可以编译成功,但mfc中报错,怎么回事?在线等待一下是错误信息:
error C2143: syntax error : missing ';' before '<'
return;
}
// Create the filter graph manager and query for interfaces.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
error C2501: 'CComPtr' : missing storage-class or type specifiers
error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'

DirectShow环境配置(vc++6.0下)文档

DirectShow环境配置(vc++6.0下)文档

DirectShow环境配置(VC6.0++下)DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。

它支持多种多样的媒体文件格式,包括ASF、MPEG、A VI、MP3和WA V文件,同时支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。

DirectShow整合了其它的DirectX技术,能自动地侦测并使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。

下面从以下几点分析在VC++6.0下DirectShow的环境配置问题:1.安装的软件版本(1) 操作系统版本:Windows XP Professional SP2(2) Windows SDK版本:Windows Server 2003 PSDK February 2003 Edition,下载链接如下:/msdownload/platformsdk/sdkupdate/psdk-full.htm,把SDK包(13个cab+2=15个文件)下载,然后打开电脑开始\程序\附件\命令提示符,进行解压,安装。

详细指令代码见上述链接网页。

(3) DirectX SDK 版本:Microsoft DirectX 9.0 SDK (Summer 2004),下载链接如下:/downloads/details.aspx?FamilyID=fd044a42-9912-42a3-9a9e-d857199 f888e&DisplayLang=en(4) VC版本: VC++6.0英文版(613M)2.编译BaseClasses由于DirectX SDK2004 的BaseClasses没有生成静态链接库,所以单独提取BaseClasses的编译步骤。

(1) 配置DirectShow针对所有项目的环境:打开Tools->Options ->Directories,在Show Directories for栏:首先选择Include files:添加如下项目(注意:添加的项目必须在原有项目的前面)DirectX SDK安装目录\IncludePS:如果DirectShow与dx-sdk是分开的,需加入DirectShow的IncludeDirectX SDK安装目录\Samples\C++\CommonDirectX SDK安装目录\Samples\C++\DirectShow\BaseClassesWindows SDK安装目录\Include然后选择Library files:添加如下项目(注意:添加的项目必须在原有项目的前面)DirectX SDK安装目录\LIBPS:如果DirectShow与dx-sdk是分开的,需加入DirectShow的LIBWindows SDK 安装目录\LIB全部添加完毕后,点击OK。

最新DirectShow视频采集开发指南

最新DirectShow视频采集开发指南
在开发 DirectShow 应用程序时,通常需要设计一个过滤图表(Filter Graph),向过滤图表中添加 相应的过滤器,最后连接过滤器的引脚就完成了功能的设计。例如,实现一个简单的视频预览功能, 需要向过滤图表中添加一个视 频捕捉源过滤器和一个 Video Renderer 过滤 器,将视频捕捉源过滤 器的输出引脚与 Video Renderer 过滤器的输入引脚相连就可以了。而在程序中只需要按照设计过滤 图表的捕捉添加过滤器并连接过滤器引脚就可以了。在连接过滤器引脚时需要注 意:只能是输出过 滤器引脚与输入过滤器引脚相连,两个输出过滤器或两个输入过滤器引脚是不能相连的。
卡,为 CLSID_VideoCompressorCategory,表示枚举系统中的视频压缩器。下面的代码演示了如何枚 举系统中的视频捕捉卡。 //枚举视频设备 ICreateDevEnum *pDevEnum = NULL; CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc); pMoniker->Release(); break; } pClassEnum->Release(); 而下面的代码则用于判断系统中是否安装了指定的视频压缩器。 ICreateDevEnum *pDevEnum = NULL; CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **)&pDevEnum); IEnumMoniker *pClassEnum = NULL; //列举视频压缩设备 pDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pClassEnum, 0); while (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK) { IPropertyBag* pProp= NULL;

基于directshow的视频播放器设计与实现

基于directshow的视频播放器设计与实现

DeviceFilter。

图1播放AVI文件的过滤器图管理器
图1中的箭头表示Filter链表中的数据流的方向。

在DirectShow 像上面的这样一个Filter链表我们称为Filter Graph。

一般分为下面几种类型。

(1)源过滤器(Source Filter):源过滤器引入数据到过滤器图中据来源可以是文件、网络、照相机等。

不同的源过滤器处理不同类型的数据源。

(2)变换过滤器(Transform Filter):变换过滤器的工作是获取输入
处理数据,并生成输出流。

变换过滤器对数据的处理包括编解码格式转换、压缩解压缩等。

(3)提交过滤器(Renderer Filter):提交过滤器在过滤器图里处于最后一级,它们接收数据并把数据提交给外设。

Filter有三种状态:运行、暂停、停止,Filter Graph中所有的
图2
具体功能实现
媒体播放器的定位接口的获取、全屏实现、音量控制和静音设置关键代码实例。

首先获取Filter Graph的各个控制接口,查询接口函数的代码如得到播放器控制接口、定位接口等CDXGraph::QueryInterfaces(void)
(mGraph)
HRESULT hr=NOERROR;
得到播放控制接口
|=mGraph->QueryInterface(IID_IMediaControl,
&mMediaControl);
得到媒体事件接口
能上相对于同类软件有一定优势。

DirectShow开发指南——学习笔记

DirectShow开发指南——学习笔记

第一部分DirectShow基础知识第1章系统概述1.1DirectX 大家族1.DirectX软件开发包是微软公司提供的一套在Wdinows操作平台上开发高性能图形、声音、输入、输出和网络游戏的编程接口。

2.DirectShow是DirectX中的一位集大成者。

1.2DirectShow简介一、DirectShow系统1.图中最大的一块是DriectShow系统,虚线以下是Ring0特权级别的硬件设备,虚线以上是Ring3特权级别的应用层。

DirectShow位于应用层中。

2.它使用一种叫作Filter Graph的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫作Filter;各个Filter在Filter Graph中按一定的顺序连接成一条流水线协同工作。

3.Filter大致分为3类:(1)Source Filters 负责获取数据,文件源可以是文件等,然后将数据往下传输。

(2)Transform Filters负责数据的格式转换,将数据继续往下传输。

(3)Rendering Filters负责数据的最终去向,将数据送给显卡、声卡进行多媒体的演示,或者输出到文件进行存储。

二、播放第一个媒体文件问题。

本身是一种规范,而不是实现。

当使用C++实现时,COM组件就是一个C++类,而接口就是纯虚类。

规范规定,任何组件或接口都必须从IUnknown接口中继承而来。

IUnknown定义了3个重要函数:(1)QueryInterface负责组件对象上的接口查询(2)AddRef增加引用计数(3)Release用于减少引用计数组件实际上是一个C++类,对于组件的外部使用者来说,这个类名一般不可知。

COM规范规定,每个组件都必须实现一个与之相对应的类工作Class Factory。

类工厂也是一个COM组件,它实现了IClassFactory接口。

在IClassFactory接口函数CreateInstance中,才能使用new操作生成一个COM组件实例。

实现DirectShow技术开发准备

实现DirectShow技术开发准备

C#实现DirectShow技术开发准备时间:2009-10-21 23:45 点击:73次字体:[大中小]DirectShow组件在“C:WINDOWSsystem32”目录下的Quartz.dll动态库中,要使C#代码引用COM对象和接口,必须将COM类型库转换为.NET框架元数据,从而有效地创建一个可以从任何托管语言调用的托管包装。

在转换过程中需要使用FrameWork SDK自带的TlbImp命令工具,该命令工具在“D:Program FilesMicrosoft Visual Studio 8SDKv2.0BinTlbImp.exe”目录下(取决于Visual Studio 2005的安装路径)。

该命令的使用方法为:TlbImp C:WINDOWSsystem32quartz.dll out:C:WINDOWSsystem32quartzDriectShow.dll在DOS命令下执行转换成功。

转换完成后需在应用程序引用quartzDriectShow,引用quartzDriectShow.dll组件步骤如下:(1)在Visual Studio 2005开发环境中,选择菜单“项目”/“添加引用”命令,弹出“添加引用”对话框。

(2)选择“浏览”选项卡,通过浏览找到引用quartzDriectShow.dll所在的位置,并引用到程序中来。

(3)最后引入using quartzDriectShow,在程序中可以开发相关多媒体程序了。

开发人员还可以通过编写自己的过滤器扩展DirectShow多媒体支持。

下面是DirectShow组件的接口。

l IFilterGraph:过滤通道接口。

l IFilterGraph2:增强的IfilterGraph。

l IGraphBuilder:最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph Manager。

l IMediaControl:用来控制流媒体(如流的启动和停止暂停等)播放控制接口。

1C#程序中的DIRECTSHOW设计

1C#程序中的DIRECTSHOW设计
const int EC_COMPLETE = 0x01; const int WS_CHILD = 0x40000000; const int WS_CLIPCHILDREN = 0x2000000; FilgraphManager m_objFilterGraph = null; IBasicAudio m_objBasicAudio = null; IVideoWindow m_objVidwoWindow = null; IMediaEvent m_objMediaEvent = null; IMediaEventEx m_obnMediaEventEx = null; IMediaPosition m_objMediaPosition = null; IMediaControl m_objMediaControl = null; //枚举 enum MediaStatus { None, Stopped, Paused, Running }; MediaStatus m_CurrentStatus = MediaStatus.None; private void Clear() { if (m_objMediaControl != null)
m_obnMediaEventEx.SetNotifyWindow((int)this.Handle, WM_GRAPHNOTIFY, 0); m_objMediaPosition = m_objFilterGraph as IMediaPosition; //播放位置和速度控 制
m_objMediaControl = m_objFilterGraph as IMediaControl; //用来控制流媒体 播放控制接口
设置播放格式。常用的控制播放方式为 TIME_FORMAT_MEDIA_TIME,单位 100ns;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C#实现DirectShow技术开发准备时间:2009-10-21 23:45 点击:73次字体:[大中小]DirectShow组件在“C:WINDOWSsystem32”目录下的Quartz.dll动态库中,要使C#代码引用COM对象和接口,必须将COM类型库转换为.NET框架元数据,从而有效地创建一个可以从任何托管语言调用的托管包装。

在转换过程中需要使用FrameWork SDK自带的TlbImp命令工具,该命令工具在“D:Program FilesMicrosoft Visual Studio 8SDKv2.0BinTlbImp.exe”目录下(取决于Visual Studio 2005的安装路径)。

该命令的使用方法为:TlbImp C:WINDOWSsystem32quartz.dll out:C:WINDOWSsystem32quartzDriectShow.dll在DOS命令下执行转换成功。

转换完成后需在应用程序引用quartzDriectShow,引用quartzDriectShow.dll组件步骤如下:(1)在Visual Studio 2005开发环境中,选择菜单“项目”/“添加引用”命令,弹出“添加引用”对话框。

(2)选择“浏览”选项卡,通过浏览找到引用quartzDriectShow.dll所在的位置,并引用到程序中来。

(3)最后引入using quartzDriectShow,在程序中可以开发相关多媒体程序了。

开发人员还可以通过编写自己的过滤器扩展DirectShow多媒体支持。

下面是DirectShow组件的接口。

l IFilterGraph:过滤通道接口。

l IFilterGraph2:增强的IfilterGraph。

l IGraphBuilder:最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph Manager。

l IMediaControl:用来控制流媒体(如流的启动和停止暂停等)播放控制接口。

l IMediaEvent:播放事件接口,该接口在FilterGraph发生一些事件时用来创建事件的标志信息并传送给应用程序。

l IMediaEventEx:扩展播放事件窗口。

l IMediaPosition:播放的位置和速度控制接口(控制播放放置只能为设置时间控制方式)。

l IMediaSeeking:另一个播放的位置和播放速度控制接口,在位置选择方面功能较强,设置播放格式。

常用的控制播放方式有:TIME_FORMAT_MEDIA_TIME单位100纳秒;TIME_FORMAT_FRAME按帧播放。

l IBasicAudio:声音控制接口。

l IBasic Video:图像控制接口(波特率,宽度,长度等信息)。

l IVideoWindow:显示窗口控制接口(有关播放窗口的一切控制,包括caption显示,窗口位置控制等)。

l ISampleGrabber:捕获图像接口(可用于抓图控制)。

l IVideoFrameStep:控帛单帧播放的接口。

注意:使用DirectShow接口编程有3个步骤:初始化接口→利用接口中的控制函数使用控制操作→最后释放接口。

原文来自:雨枫技术教程网原文网址:/plus/view-140098-1.html一个用C#开发的DirectShow媒体播放器(作者:Daniel Strigl)关键字:一个用C#开发的DirectShow媒体播放器(作者:Daniel Strigl) 按"Browse..." 选择DirectShow COM DLL。

using QuartzTypeLib;关于代码:怎样建立DirectShow并选择媒体文件?在选择了主菜单下的"File -> Open..."后,显示"Open File"对话框然后用户可以选择一个媒体文件。

在C#中通过建立一个OpenFileDialog类对象并使用ShowDialog()方法来实现。

OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "Media Files|*.mpg;*.avi;*.wma;*.mov;" +"*.wav;*.mp2;*.mp3|All Files|*.*";if (DialogResult.OK == openFileDialog.ShowDialog()){...在以上完成之后,我们开始建立了DirectShow并开始渲染媒体文件。

通过以下几步完成:建立图象过滤管理(FGM)建立图象过滤(通过FGM)播放图象并返回事件以下代码演示怎样建立图象过滤管理和图象过滤:CollapseCleanUp();m_objFilterGraph = new FilgraphManager();m_objFilterGraph.RenderFile(openFileDialog.FileName);m_objBasicAudio = m_objFilterGraph as IBasicAudio;try{m_objVideoWindow = m_objFilterGraph as IVideoWindow;m_objVideoWindow.Owner = (int) panel1.Handle;m_objVideoWindow.windowstyle = WS_CHILD | WS_CLIPCHILDREN;m_objVideoWindow.SetWindowPosition(panel1.ClientRectangle.Left,panel1.ClientRectangle.Top,panel1.ClientRectangle.Width,panel1.ClientRectangle.Height);}catch (Exception ex){m_objVideoWindow = Null;}m_objMediaEvent = m_objFilterGraph as IMediaEvent;m_objMediaEventEx = m_objFilterGraph as IMediaEventEx;m_objMediaEventEx.SetNotifyWindow((int) this.Handle, WM_GRAPHNOTIFY, 0);m_objMediaPosition = m_objFilterGraph as IMediaPosition;m_objMediaControl = m_objFilterGraph as IMediaControl;通过CleanUp()我们删除对象,如果对象存在。

在我们可以开始渲染一个文件时,我们必须建立FilterGraphManager的几个新对象用新的方法。

RenderFile()方法建立了一个图象过滤器用来渲染指定文件。

IBasicAudio类用来设定声音的大小和质量。

IVideoWindow 类用来设定窗口风格,窗口位置。

该函数是附加的,如果你播放声音文件,你如果调用该方法。

可是播放声音文件不需要IVideoWindow类,所以将m_objVideoWindow设置成Null。

IMediaEvent和IMediaEventEx类用来侦听消息,用来发送DirectShow信息到父窗口。

通过IMediaPosition类,可以设置当前的位置。

通过IMediaControl类来控制开始,停止视频和声音的播放。

想了解更多关于DirectShow的内容请读一下MSDN的文档。

怎样播放媒体文件?用IMediaControl类的Run()方法来开始播放一个视频或声音文件。

m_objMediaControl.Run();怎样暂停播放?如果你想要暂停播放一个视频或声音文件,使用IMediaControl类的Pause()方法。

m_objMediaControl.Pause();怎样停止播放?用IMediaControl类的Stop()方法来停止播放一个视频或声音。

m_objMediaControl.Stop();怎样得到文件的播放进度和持续时间?当媒体文件被播放时,我们在状态栏指定当前的播放进度和文件长度。

我们读取全部100MS内IMediaPosition类得到的当前进度并将大小显示在状态栏。

为了得到文件长度我们读取了IMediaPosition类的Duration成员变量。

private void timer1_Tick(object sender, System.EventArgs e){if (m_CurrentStatus == MediaStatus.Running){UpdateStatusBar();}}时间函数每隔100MS调用UpdateStatusBar()方法,用来显示当前位置和文件进度。

Collapseprivate void UpdateStatusBar(){switch (m_CurrentStatus){case MediaStatus.None : statusBarPanel1.Text = "Stopped"; break;case MediaStatus.Paused : statusBarPanel1.Text = "Paused "; break;case MediaStatus.Running: statusBarPanel1.Text = "Running"; break;case MediaStatus.Stopped: statusBarPanel1.Text = "Stopped"; break;}if (m_objMediaPosition != Null){int s = (int) m_objMediaPosition.Duration;int h = s / 3600;int m = (s - (h * 3600)) / 60;s = s - (h * 3600 + m * 60);statusBarPanel2.T ext = String.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s);s = (int) m_objMediaPosition.CurrentPosition;h = s / 3600;m = (s - (h * 3600)) / 60;s = s - (h * 3600 + m * 60);statusBarPanel3.T ext = String.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s);}else{statusBarPanel2.T ext = "00:00:00";statusBarPanel3.T ext = "00:00:00";}}当文件播放结束时会怎样?为了判定,文件是在结束状态,我们重写了WndProc函数,处理EC_COMPLETE消息,当文件结束播放时,将向窗口发送DirectShow消息。

相关文档
最新文档