C#程序中的DirectShow设计.doc_第1页
C#程序中的DirectShow设计.doc_第2页
C#程序中的DirectShow设计.doc_第3页
C#程序中的DirectShow设计.doc_第4页
C#程序中的DirectShow设计.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

内容导读: (1)在Visual Studio 2005开发环境中,选择菜单项目/添加引用命令,弹出添加引用对话框。 (2)选择浏览选项卡,通过浏览找到引用quartzDriectShow.dll所在的位-(1)在Visual Studio 2005开发环境中,选择菜单“项目”/“添加引用”命令,弹出“添加引用”对话框。(2)选择“浏览”选项卡,通过浏览找到引用quartzDriectShow.dll所在的位置,并引用到程序中。如图4所示。(3)引入using quartzDriectShow后,在程序中就可以开发相关多媒体程序了。开发人员还可以通过编写自己的过滤器扩展DirectShow多媒体支持。下面是DirectShow组件的接口。l IFilterGraph:过滤通道接口。l IFilterGraph2:增强的IfilterGraph。图4 引用quartzDriectShow组件l IGraphBuilder:最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph Manager。l IMediaControl:用来控制流媒体(如流的启动和停止暂停等)播放控制接口。l IMediaEvent:播放事件接口,该接口在FilterGraph发生一些事件时用来创建事件的标志信息并传送给应用程序。l IMediaEventEx:扩展播放事件窗口。l IMediaPosition:播放的位置和速度控制接口(控制播放放置只能为设置时间控制方式)。l IMediaSeeking:另一个播放的位置和播放速度控制接口,有较强的位置选择功能设置播放格式。常用的控制播放方式为TIME_FORMAT_MEDIA_TIME,单位100ns;TIME_FORMAT_ FRAME,按帧播放。l IBasicAudio:声音控制接口。l IBasic Video:图像控制接口(波特率、宽度、长度等信息)。l IVideoWindow:显示窗口控制接口(有关播放窗口的一切控制,包括caption显示,窗口位置控制等)。l ISampleGrabber:捕获图像接口(可用于抓图控制)。l IVideoFrameStep:控制单帧播放的接口。注意:使用DirectShow接口编程有3个步骤,初始化接口利用接口中的控制函数使用控制操作释放接口。4使用测试工具GraphEdit测试工具(GraphEdit)所在安装路径为“D:mssdkbinDXUtilsgraphedt.exe”。通过该工具,可以很直观地看到Filter Graph的运行及处理流程,方便进行程序调试。首先运行GraphEdit,执行菜单“File”/“Render Media File”命令,然后选择一个媒体文件;当Filter Graph构建成功后,单击工具栏的【运行】按钮,播放已选择的媒体文件,如图5所示。示例DirectShow技术设计多媒体播放器本示例利用DirectShow技术来实现多媒体播放器。程序运行结果如图6所示网站源代码。图5 GraphEdit测试工具的使用图6 DirectShow技术设计多媒体播放器程序开发步骤如下所示。(1)创建一个项目,命名为27_03,设置默认窗体的Text属性为“多媒体播放器”。(2)在窗体上添加6个Button控件,主要用来操作播放的媒体文件,如图6所示。(3)在窗体上添加一个TrackBar控件,用来显示媒体文件播放的进度。(4)在窗体上添加一个Timer控件,用来计算媒体当前的进度。(5)程序代码如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using quartzDriectShow;namespace _7_03public partial class Form1 : Formpublic Form1()InitializeComponent();/设置常量const int WM_APP = 0x8000;const int WM_GRAPHNOTIFY = WM_APP + 1;内容导读: 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_objVid-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_objMediaControl.Stop();if (m_obnMediaEventEx != null)m_obnMediaEventEx.SetNotifyWindow(0, 0, 0);if(m_objVidwoWindow!=null)m_objVidwoWindow.Visible = 0;m_objVidwoWindow.Owner = 0;if (m_objBasicAudio != null) m_objBasicAudio = null;if (m_objFilterGraph != null) m_objFilterGraph = null;if (m_objMediaControl != null) m_objMediaControl = null;if (m_objMediaEvent != null) m_objMediaEvent = null;if (m_objMediaPosition != null) m_objMediaPosition = null;if (m_objVidwoWindow != null) m_objVidwoWindow = null;if (m_obnMediaEventEx != null) m_obnMediaEventEx = null;this.Text = 多媒体播放器;timer1.Enabled = False;trackBar1.Value = 0;private void button1_Click(object sender, EventArgs e)OpenFileDialog openFile = new OpenFileDialog();openFile.Filter = 选择播放文件|*.mpg;*.avi;*.mov;*.wma;*.wav;*.mp3|All Files|*.*;if (DialogResult.OK = openFile.ShowDialog()this.Clear();/清理正在播放的文件m_objFilterGraph = new FilgraphManager();trym_objFilterGraph.RenderFile(openFile.FileName);m_objBasicAudio = m_objFilterGraph as IBasicAudio;/图像控制接口m_objVidwoWindow = m_objFilterGraph as IVideoWindow;/声音控制接口m_objVidwoWindow.Owner =(int) this.Handle;/设置窗口类型m_objVidwoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;/设置播放容器m_objVidwoWindow.SetWindowPosition(this.ClientRectangle.Left, this.ClientRectangle.Top, this. ClientRectangle.Width, this.ClientRectangle.Height-60);catch (Exception ex)MessageBox.Show(ex.Message);/当出错时,为音频文件,将视频对象清空m_objVidwoWindow = null;m_objMediaEvent = m_objFilterGraph as IMediaEvent;/播放事件接口m_obnMediaEventEx = m_objFilterGraph as IMediaEventEx;/扩展播放事件接口m_obnMediaEventEx.SetNotifyWindow(int)this.Handle, WM_GRAPHNOTIFY, 0);m_objMediaPosition = m_objFilterGraph as IMediaPosition;/播放位置和速度控制m_objMediaControl = m_objFilterGraph as IMediaControl;/用来控制流媒体播放控制接口this.Text = openFile.FileName +-+ this.Text;m_objMediaControl.Run();/播放文件trytrackBar1.LargeChange = 1;trackBar1.Maximum = (int)m_objMediaPosition.Duration;timer1.Enabled = True;catch private void button2_Click(object sender, EventArgs e)/播放if (m_objMediaControl!=null)m_objMediaControl.Run();private void button3_Click(object sender, EventArgs e)/暂停m_objMediaControl.Pause();private void button4_Click(object sender, EventArgs e)/停止本教程来自:m_objMediaControl.Stop();m_objMediaPosition.CurrentPosition = 0;this.Clear();private void button5_Click(object sender, EventArgs e)/快退if (m_objMediaPosition.CurrentPosition = 1)m_objMediaPosition.CurrentPosition = m_objMediaPosition.CurrentPosition - 1;elsem_objMediaPosition.CurrentPosition = 0;private void button6_Click(object sender, EventArgs e)/快进m_objMediaPosition.CurrentPosition = m_objMediaPosition.CurrentPosition + 1;private void timer1_Tick(object sender, EventArgs e)/显示文件播放的进度trackBar1.Value = (int)m_objMediaPosition.CurrentPosition;private void trackBar1_Scroll(object sender, EventArgs e)/根据滚动进度条,来播放文件m_objMediaPosition.CurrentPosition = trackBar1.Value;完整程序代码如下: Form1.cs窗体代码文件完整程序代码网站源代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using quartzDriectShow;namespace _7_03内容导读: public partial class Form1 : Form public Form1() InitializeComponent(); /设置常量 const int WM_APP = 0x8000; const int WM_GRAPHNOTIFY = WM_APP + 1; const int EC_COMPLETE = 0x01; const int-public partial class Form1 : Formpublic Form1()InitializeComponent();/设置常量const int WM_APP = 0x8000;const int WM_GRAPHNOTIFY = WM_APP + 1;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 Form1_Load(object sender, EventArgs e)private void Clear()if (m_objMediaControl != null)m_objMediaControl.Stop();if (m_obnMediaEventEx != null)m_obnMediaEventEx.SetNotifyWindow(0, 0, 0);if(m_objVidwoWindow!=null)m_objVidwoWindow.Visible = 0;m_objVidwoWindow.Owner = 0;if (m_objBasicAudio != null) m_objBasicAudio = null;if (m_objFilterGraph != null) m_objFilterGraph = null;if (m_objMediaControl != null) m_objMediaControl = null;if (m_objMediaEvent != null) m_objMediaEvent = null;if (m_objMediaPosition != null) m_objMediaPosition = null;if (m_objVidwoWindow != null) m_objVidwoWindow = null;if (m_obnMediaEventEx != null) m_obnMediaEventEx = null;this.Text = 多媒体播放器;timer1.Enabled = false;trackBar1.Value = 0;private void button1_Click(object sender, EventArgs e)OpenFileDialog openFile = new OpenFileDialog();openFile.Filter = 选择播放文件|*.mpg;*.avi;*.mov;*.wma;*.wav;*.mp3|All Files|*.*;if (DialogResult.OK = openFile.ShowDialog()/本教程来自:this.Clear();/清理正在播放的文件m_objFilterGraph = new FilgraphManager();trym_objFilterGraph.RenderFile(openFile.FileName);m_objBasicAudio = m_objFilterGraph as IBasicAudio;/图象控制接口m_objVidwoWindow = m_objFilterGraph as IVideoWindow;/声音控制接口m_objVidwoWindow.Owner =(int) this.Handle;/设置窗口类型m_objVidwoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;/设置播放容器m_objVidwoWindow.SetWindowPosition(this.ClientRectangle.Left, this.ClientRectangle.Top, this.ClientRectangle.Width, this.ClientRectangle.Height-60);catch (Exception ex)MessageBox.Show(ex.Message);/当出错时,为音频文件,将视频对象清空m_objVidwoWindow = null;m_objMediaEvent = m_objFilterGraph as IMediaEvent;/播放事件接口m_obnMediaEventEx = m_objFilterGraph as IMediaEventEx;/扩展播放事件接口m_obnMediaEventEx.SetNotifyWindow(int)this.Handle, WM_GRAPHNOTIFY, 0);m_objMediaPosition = m_objFilterGraph as IMediaPosition;/播放位置和速度控制m_objMediaControl = m_objFilterGraph as IMediaControl;/用来控制流媒体播放控制接口this.Text = openFile.FileName +-+ this.Text;m_objMediaControl.Run();/播放文件trytrackBar1.LargeChange = 1;trackBar1.Maximum = (int)m_objMediaPosition.Duration;timer1.Enabled = true;catch private void button2_Click(object sender, EventArgs e)/播放if (m_objMediaControl!=null)m_objMediaControl.Run();private void button3_Click(object sender, EventArgs e)/暂停m_objMediaControl.Pause();private void button4_Click(object sender, EventArgs e)/停止m_objMediaControl.Stop();m_objMediaPosition.CurrentPosition = 0;this.Clear();private void button5_Click(object sender, EventArgs e)/快退if (m_objMediaPosition.CurrentPosition = 1)m_objMediaPosition.CurrentPosition = m_objMediaPosition.CurrentPosition - 1;elsem_objMediaPosition.CurrentPosition = 0;private void button6_Click(object sender, EventArgs e)/快进m_objMediaPosition.CurrentPosition = m_objMediaPosition.CurrentPosition + 1;private void timer1_Tick(object sender, EventArgs e)/显示文件播放的进度trackBar1.Value = (int)m_objMediaPosition.CurrentPosition;private void trackBar1_Scroll(object sender, EventArgs e)/根据滚动进度条,来播放文件m_objMediaPosition.CurrentPosition = trackBar1.Value; Form1.Designer.cs窗体设计文件完整程序代码namespace _7_03内容导读: partial class Form1 / summary / 必需的设计器变量。 / /summary private System.ComponentModel.IContainer components = null; / summary / 清理所有正在使用的资源。 / /s-partial class Form1/ / 必需的设计器变量。/ private System.ComponentModel.IContainer components = null;/ / 清理所有正在使用的资源。/ / 如果应释放托管资源,为 true;否则为 tected override void Dispose(bool disposing)if (disposing & (components != null)components.Dispose();base.Dispose(disposing);#region Windows 窗体设计器生成的代码/ / 设计器支持所需的方法 - 不要/ 使用代码编辑器修改此方法的内容。/ private void InitializeComponent()ponents = new System.ComponentModel.Container();this.button1 = new System.Windows.Forms.Button();this.button2 = new System.Windows.Forms.Button();this.button3 = new System.Windows.Forms.Button();this.button4 = new System.Windows.Forms.Button();this.button5 = new System.Windows.Forms.Button();this.button6 = new System.Windows.Forms.Button();this.trackBar1 = new System.Windows.Forms.TrackBar();this.timer1 = new System.Windows.Forms.Timer(ponents);(System.ComponentModel.ISupportInitialize)(this.trackBar1).BeginInit();this.SuspendLayout();/ button1/this.button1.Location = new System.Drawing.Point(7, 254);this.button1.Name = button1;this.button1.Size = new System.Drawing.Size(75, 23);this.button1.TabIndex = 1;this.button1.Text = 打开;this.button1.UseVisualStyleBackColor = true;this.button1.Click += new System.EventHandler(this.button1_Click);/ button2/this.button2.Location = new System.Drawing.Point(88, 254);this.button2.Name = button2;this.button2.Size = new System.Drawing.Size(75, 23);this.button2.TabIndex = 2;this.button2.Text = 播放;this.button2.UseVisualStyleBackColor = true;this.button2.Click += new System.EventHandler(this.button2_Click);/ button3/本教程来自:this.button3.Location = new System.Drawing.Point(331, 254);this.button3.Name = button3;this.button3.Size = new System.Drawing.Size(75, 23);this.button3.TabIndex = 3;this.button3.Text = 暂停;this.button3.UseVisualStyleBackColor = true;this.button3.Click += new System.EventHandler(this.button3_Click);/ button4/this.button4.Location = new System.Drawing.Point(412, 254);this.button4.Name = button4;this.button4.Size = new System.Drawing.Size(75, 23);this.button4.TabIndex = 4;this.button4.Text = 停止;this.button4.UseVisualStyleBackColor = true;this.button4.Click += new System.EventHandler(this.button4_Click);/ button5/this.button5.Location = new System.Drawing.Point(169, 254);this.button5.Name = button5;this.button5.Size = new System.Drawing.Size(75, 23);this.button5.TabIndex = 5;this.button5.Text = 快进;this.button6.UseVisualStyleBackColor = true;this.button6.Click += new System.EventHandler(this.button6_Click);/ trackBar1/this.trackBar1.Cursor = System.Windows.Forms.Cursors.NoMoveHoriz;this.trackBar1.LargeChange = 1;this.trackBar1.Location = new System.Drawing.Point(1, 210);this.trackBar1.Maximum = 50;this.trackBar1.Name = trackBar1;this.trackBar1.Size = new System.Drawing.Size(494, 45);this.trackBar1.TabIndex = 6;this.trackBar1.TickStyle = System.Windows.Forms.TickStyle.Both;this.trackBar1.Value = 1;this.trackBar1.Scroll += new System.EventHandler(this.trackBar1_Scroll);/本教程来自:/ timer1/this.timer1.Interval = 500;this.timer1.Tick += new System.EventHandler(this.timer1_Tick);/ Form1/this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMod

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论