C#实现DirectShow技术开发准备时间:2009-10-2123:45点击:73次字体:[大中小]DirectShow组件在“C:WINDOWSsystem32”目录下的Quartz.dll动态库中,要使C#代码引用COM对象和接口,必须将COM类型库转换为.NET框架元数据,从而有效地创建一个可以从任何托管语言调用的托管包装。在转换过程中需要使用FrameWorkSDK自带的TlbImp命令工具,该命令工具在“D:ProgramFilesMicrosoftVisualStudio8SDKv2.0BinTlbImp.exe”目录下(取决于VisualStudio2005的安装路径)。该命令的使用方法为:TlbImpC:WINDOWSsystem32quartz.dllout:C:WINDOWSsystem32quartzDriectShow.dll在DOS命令下执行转换成功。转换完成后需在应用程序引用quartzDriectShow,引用quartzDriectShow.dll组件步骤如下:(1)在VisualStudio2005开发环境中,选择菜单“项目”/“添加引用”命令,弹出“添加引用”对话框。(2)选择“浏览”选项卡,通过浏览找到引用quartzDriectShow.dll所在的位置,并引用到程序中来。(3)最后引入usingquartzDriectShow,在程序中可以开发相关多媒体程序了。开发人员还可以通过编写自己的过滤器扩展DirectShow多媒体支持。下面是DirectShow组件的接口。lIFilterGraph:过滤通道接口。lIFilterGraph2:增强的IfilterGraph。lIGraphBuilder:最为重用的COM接口,用于手动或者自动构造过滤通道FilterGraphManager。lIMediaControl:用来控制流媒体(如流的启动和停止暂停等)播放控制接口。lIMediaEvent:播放事件接口,该接口在FilterGraph发生一些事件时用来创建事件的标志信息并传送给应用程序。lIMediaEventEx:扩展播放事件窗口。lIMediaPosition:播放的位置和速度控制接口(控制播放放置只能为设置时间控制方式)。lIMediaSeeking:另一个播放的位置和播放速度控制接口,在位置选择方面功能较强,设置播放格式。常用的控制播放方式有:TIME_FORMAT_MEDIA_TIME单位100纳秒;TIME_FORMAT_FRAME按帧播放。lIBasicAudio:声音控制接口。lIBasicVideo:图像控制接口(波特率,宽度,长度等信息)。lIVideoWindow:显示窗口控制接口(有关播放窗口的一切控制,包括caption显示,窗口位置控制等)。lISampleGrabber:捕获图像接口(可用于抓图控制)。lIVideoFrameStep:控帛单帧播放的接口。注意:使用DirectShow接口编程有3个步骤:初始化接口→利用接口中的控制函数使用控制操作→最后释放接口。原文来自:雨枫技术教程网原文网址:一个用C#开发的DirectShow媒体播放器(作者:DanielStrigl)关键字:一个用C#开发的DirectShow媒体播放器(作者:DanielStrigl)按Browse...选择DirectShowCOMDLL。usingQuartzTypeLib;关于代码:怎样建立DirectShow并选择媒体文件?在选择了主菜单下的File-Open...后,显示OpenFile对话框然后用户可以选择一个媒体文件。在C#中通过建立一个OpenFileDialog类对象并使用ShowDialog()方法来实现。OpenFileDialogopenFileDialog=newOpenFileDialog();openFileDialog.Filter=MediaFiles|*.mpg;*.avi;*.wma;*.mov;+*.wav;*.mp2;*.mp3|AllFiles|*.*;if(DialogResult.OK==openFileDialog.ShowDialog()){...在以上完成之后,我们开始建立了DirectShow并开始渲染媒体文件。通过以下几步完成:建立图象过滤管理(FGM)建立图象过滤(通过FGM)播放图象并返回事件以下代码演示怎样建立图象过滤管理和图象过滤:CollapseCleanUp();m_objFilterGraph=newFilgraphManager();m_objFilterGraph.RenderFile(openFileDialog.FileName);m_objBasicAudio=m_objFilterGraphasIBasicAudio;try{m_objVideoWindow=m_objFilterGraphasIVideoWindow;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(Exceptionex){m_objVideoWindow=Null;}m_objMediaEvent=m_objFilterGraphasIMediaEvent;m_objMediaEventEx=m_objFilterGraphasIMediaEventEx;m_objMediaEventEx.SetNotifyWindow((int)this.Handle,WM_GRAPHNOTIFY,0);m_objMediaPosition=m_objFilterGraphasIMediaPosition;m_objMediaControl=m_objFilterGraphasIMediaControl;通过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成员变量。privatevoidtimer1_Tick(objectsender,System.EventArgse){if(m_CurrentStatus==MediaStatus.Running){UpdateStatusBar();}}时间函数每隔100MS调用UpdateStatusBar()方法,用来显示当前位置和文件进度。CollapseprivatevoidUpdateStatusBar(){switch(m_CurrentStatus){caseMediaStatus.None:statusBarPanel1.Text=Stopped;break;caseMediaStatus.Paused:statusBarPanel1.Text=Paused;break;caseMediaStatus.Running:statusBarPanel1.Text=Running;break;caseMediaStatus.Stopped:statusBarPanel1.Text=Stopped;break;}if(m_objMediaPosition!=Null){ints=(int)m_objMediaPosition.Duration;inth=s/3600;intm=(s-(h*3600))/60;s=s-(h*3600+m*60);statusBarPanel2.Text=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.Text=String.Format({0:D2}:{1:D2}:{2:D2},h,m,s);}else{statusBarPanel2.Text=00:00:00;statusBarPanel3.Text=00:00:00;}}当文件播放结束时会怎样?为了判定,文件是在结束状态,我们重写了WndProc函数,处理EC_COMPLETE消息,当文件结束播放时,将向窗口发送DirectShow消息。CollapseprotectedoverridevoidWndProc(refMessagem){if(m.Msg==WM_GRAPHNOTIFY){intlEventCode;intlParam1,lParam2;while(true){try{m_objMediaEventEx.GetEvent(outlEventCode,outlParam1,outlParam2,0);m_objMediaEventEx.FreeEventParams(lEventCode,lParam1,lParam2);if(lEventCode==EC_COMPLETE){m_objMediaControl.Stop();m_objMediaPosition.CurrentPosition=0;m_CurrentStatus=MediaStatus.Stopped;UpdateStatusBar();UpdateToolBar();}}catch(Exception){break;}}}base.WndProc(refm);}关键字:一个用C#开发的DirectShow媒体播放器(作者:DanielStrigl)按Browse...选择DirectShowCOMDLL。usingQuartzTypeLib;关于代码:怎样建立DirectShow并选择媒体文件?在选择了主菜单下的File-Open...后,显示OpenFile对话框然后用户可以选择一个媒