实现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
  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消息。

相关文档
最新文档