使用c#.NET实现视频播放

使用c#.NET实现视频播放
www.xyhhxx.com  发布者: seo  时间: 2005-09-22

  使用DirectX技术实现播放,需要引用系统的 C:/WINNT/system32/quartz.dll 
是从CodeProject上看来的。前一阵看到有人需要这样的代码,所以贴出来共享一下。 

using  System;; 
using  System.Collections;; 
using  System.ComponentModel;; 
using  System.Drawing;; 
using  System.Data;; 
using  System.Windows.Forms;; 
using QuartzTypeLib;; 

namespace Greystar.FrameWork.ToolKits 

/// 〈summary〉 
/// FrmTV 的摘要说明。 
/// 〈/summary〉 
public class FrmTV :  System.Windows.Forms.UserControl 

private  System.Windows.Forms.ToolBar toolBar1;; 
private  System.Windows.Forms.ToolBarButton toolBarButton1;; 
private  System.Windows.Forms.ToolBarButton toolBarButton2;; 
private  System.Windows.Forms.ToolBarButton toolBarButton3;; 
private  System.Windows.Forms.Panel panel1;; 
private  System.Windows.Forms.ImageList imageList1;; 
private  System.Windows.Forms.Timer timer1;; 
private  System.Windows.Forms.ToolBarButton toolBarButton4;; 
private  System.ComponentModel.IContainer components;; 

private const int WM_APP = 0x8000;; 
private const int WM_GRAPHNOTIFY = WM_APP + 1;; 
private const int EC_COMPLETE = 0x01;; 
private const int WS_CHILD = 0x40000000;; 
private const int WS_CLIPCHILDREN = 0x2000000;; 

private FilgraphManager m_objFilterGraph = null;; 
private IBasicAudio m_objBasicAudio = null;; 
private IVideoWindow m_objVideoWindow = null;; 
private IMediaEvent m_objMediaEvent = null;; 
private IMediaEventEx m_objMediaEventEx = null;; 
private IMediaPosition m_objMediaPosition = null;; 
private IMediaControl m_objMediaControl = null;; 
private  System.Windows.Forms.StatusBar statusBar1;; 
private  System.Windows.Forms.StatusBarPanel statusBarPanel1;; 
private  System.Windows.Forms.StatusBarPanel statusBarPanel2;; 
private  System.Windows.Forms.StatusBarPanel statusBarPanel3;; 

enum MediaStatus { None, Stopped, Paused, Running };; 

private MediaStatus m_CurrentStatus = MediaStatus.None;; 

public FrmTV() 

// 该调用是 Windows.Forms 窗体设计器所必需的。 
InitializeComponent();; 

// TODO: 在 InitializeComponent 调用后添加任何初始化 


public FrmTV(EnvDTE._DTE dte,string workpath) 

InitializeComponent();; 
this.mDTE=dte;; 
this.mWorkPath=workpath;; 

private _DTE mDTE=null;; 
public _DTE DTE 

set 

mDTE=value;; 


get 

return mDTE;; 



//工作目录 
private string mWorkPath=null;; 
public string WorkPath 

set 

this.mWorkPath=value;; 


/// 〈summary〉 
/// 清理所有正在使用的资源。 
/// 〈/summary〉 
protected override void Dispose( bool disposing ) 

if( disposing ) 

if(components != null) 

components.Dispose();; 


base.Dispose( disposing );; 


#region 组件设计器生成的代码 
/// 〈summary〉 
/// 设计器支持所需的方法 - 不要使用代码编辑器 
/// 修改此方法的内容。 
/// 〈/summary〉 
private void InitializeComponent() 

this.components = new  System.ComponentModel.Container();; 
System.Resources.ResourceManager resources = new  System.Resources.ResourceManager(typeof(FrmTV));; 
this.toolBar1 = new  System.Windows.Forms.ToolBar();; 
this.toolBarButton4 = new  System.Windows.Forms.ToolBarButton();; 
this.toolBarButton1 = new  System.Windows.Forms.ToolBarButton();; 
this.toolBarButton2 = new  System.Windows.Forms.ToolBarButton();; 
this.toolBarButton3 = new  System.Windows.Forms.ToolBarButton();; 
this.imageList1 = new  System.Windows.Forms.ImageList(this.components);; 
this.panel1 = new  System.Windows.Forms.Panel();; 
this.timer1 = new  System.Windows.Forms.Timer(this.components);; 
this.statusBar1 = new  System.Windows.Forms.StatusBar();; 
this.statusBarPanel1 = new  System.Windows.Forms.StatusBarPanel();; 
this.statusBarPanel2 = new  System.Windows.Forms.StatusBarPanel();; 
this.statusBarPanel3 = new  System.Windows.Forms.StatusBarPanel();; 
(( System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit();; 
(( System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).BeginInit();; 
(( System.ComponentModel.ISupportInitialize)(this.statusBarPanel3)).BeginInit();; 
this.SuspendLayout();; 
// 
// toolBar1 
// 
this.toolBar1.Appearance =  System.Windows.Forms.ToolBarAppearance.Flat;; 
this.toolBar1.Buttons.AddRange(new  System.Windows.Forms.ToolBarButton[] { 
this.toolBarButton4, 
this.toolBarButton1, 
this.toolBarButton2, 
this.toolBarButton3});; 
this.toolBar1.DropDownArrows = true;; 
this.toolBar1.ImageList = this.imageList1;; 
this.toolBar1.Location = new  System.Drawing.Point(0, 0);; 
this.toolBar1.Name = "toolBar1";; 
this.toolBar1.ShowToolTips = true;; 
this.toolBar1.Size = new  System.Drawing.Size(288, 28);; 
this.toolBar1.TabIndex = 0;; 
this.toolBar1.ButtonClick += new  System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar1_ButtonClick);; 
// 
// toolBarButton4 
// 
this.toolBarButton4.ImageIndex = 3;; 
// 
// toolBarButton1 
// 
this.toolBarButton1.Enabled = false;; 
this.toolBarButton1.ImageIndex = 0;; 
// 
// toolBarButton2 
// 
this.toolBarButton2.Enabled = false;; 
this.toolBarButton2.ImageIndex = 1;; 
// 
// toolBarButton3 
// 
this.toolBarButton3.Enabled = false;; 
this.toolBarButton3.ImageIndex = 2;; 
// 
// imageList1 
// 
this.imageList1.ColorDepth =  System.Windows.Forms.ColorDepth.Depth24Bit;; 
this.imageList1.ImageSize = new  System.Drawing.Size(16, 16);; 
this.imageList1.ImageStream = (( System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));; 
this.imageList1.TransparentColor =  System.Drawing.Color.Red;; 
// 
// panel1 
// 
this.panel1.BackColor =  System.Drawing.Color.Black;; 
this.panel1.BorderStyle =  System.Windows.Forms.BorderStyle.Fixed3D;; 
this.panel1.Dock =  System.Windows.Forms.DockStyle.Fill;; 
this.panel1.Location = new  System.Drawing.Point(0, 28);; 
this.panel1.Name = "panel1";; 
this.panel1.Size = new  System.Drawing.Size(288, 252);; 
this.panel1.TabIndex = 4;; 
// 
// timer1 
// 
this.timer1.Enabled = true;; 
this.timer1.Tick += new  System.EventHandler(this.timer1_Tick);; 
// 
// statusBar1 
// 
this.statusBar1.Location = new  System.Drawing.Point(0, 260);; 
this.statusBar1.Name = "statusBar1";; 
this.statusBar1.Panels.AddRange(new  System.Windows.Forms.StatusBarPanel[] { 
this.statusBarPanel1, 
this.statusBarPanel2, 
this.statusBarPanel3});; 
this.statusBar1.ShowPanels = true;; 
this.statusBar1.Size = new  System.Drawing.Size(288, 20);; 
this.statusBar1.TabIndex = 5;; 
// 
// statusBarPanel1 
// 
this.statusBarPanel1.AutoSize =  System.Windows.Forms.StatusBarPanelAutoSize.Spring;; 
this.statusBarPanel1.BorderStyle =  System.Windows.Forms.StatusBarPanelBorderStyle.None;; 
this.statusBarPanel1.Text = "准备";; 
this.statusBarPanel1.Width = 144;; 
// 
// statusBarPanel2 
// 
this.statusBarPanel2.Alignment =  System.Windows.Forms.HorizontalAlignment.Center;; 
this.statusBarPanel2.AutoSize =  System.Windows.Forms.StatusBarPanelAutoSize.Contents;; 
this.statusBarPanel2.Text = "00:00:00";; 
this.statusBarPanel2.Width = 64;; 
// 
// statusBarPanel3 
// 
this.statusBarPanel3.Alignment =  System.Windows.Forms.HorizontalAlignment.Center;; 
this.statusBarPanel3.AutoSize =  System.Windows.Forms.StatusBarPanelAutoSize.Contents;; 
this.statusBarPanel3.Text = "00:00:00";; 
this.statusBarPanel3.Width = 64;; 
// 
// FrmTV 
// 
this.BackColor =  System.Drawing. SystemColors.Control;; 
this.Controls.Add(this.statusBar1);; 
this.Controls.Add(this.panel1);; 
this.Controls.Add(this.toolBar1);; 
this.Name = "FrmTV";; 
this.Size = new  System.Drawing.Size(288, 280);; 
this.SizeChanged += new  System.EventHandler(this.FrmTV_SizeChanged);; 
(( System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).EndInit();; 
(( System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).EndInit();; 
(( System.ComponentModel.ISupportInitialize)(this.statusBarPanel3)).EndInit();; 
this.ResumeLayout(false);; 


#endregion 

private void CleanUp() 

if (m_objMediaControl != null) 
m_objMediaControl.Stop();; 

m_CurrentStatus = MediaStatus.Stopped;; 

if (m_objMediaEventEx != null) 
m_objMediaEventEx.SetNotifyWindow(0, 0, 0);; 

if (m_objVideoWindow != null) 

m_objVideoWindow.Visible = 0;; 
m_objVideoWindow.Owner = 0;; 


if (m_objMediaControl != null) m_objMediaControl = null;; 
if (m_objMediaPosition != null) m_objMediaPosition = null;; 
if (m_objMediaEventEx != null) m_objMediaEventEx = null;; 
if (m_objMediaEvent != null) m_objMediaEvent = null;; 
if (m_objVideoWindow != null) m_objVideoWindow = null;; 
if (m_objBasicAudio != null) m_objBasicAudio = null;; 
if (m_objFilterGraph != null) m_objFilterGraph = null;; 


private void toolBar1_ButtonClick(object sender,  System.Windows.Forms.ToolBarButtonClickEventArgs e) 

switch(toolBar1.Buttons.IndexOf(e.Button)) 

case 0: 

#region 打开文件 
OpenFileDialog openFileDialog = new OpenFileDialog();; 
openFileDialog.Filter = "Media Files|*.mpg;;*.avi;;*.wma;;*.mov;;*.wav;;*.mp2;;*.mp3|All Files|*.*";; 

if (DialogResult.OK == openFileDialog.ShowDialog()) 

CleanUp();; 

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) 

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;; 

this.Text = "DirectShow - [" + openFileDialog.FileName + "]";; 

m_objMediaControl.Run();; 
m_CurrentStatus = MediaStatus.Running;; 


break;; 
#endregion 


case 1: 

m_objMediaControl.Run();; 
m_CurrentStatus = MediaStatus.Running;; 
break;; 


case 2: 

m_objMediaControl.Pause();; 
m_CurrentStatus = MediaStatus.Paused;; 
break;; 


case 3: 

m_objMediaControl.Stop();; 
m_objMediaPosition.CurrentPosition = 0;; 
m_CurrentStatus = MediaStatus.Stopped;; 
break;; 



UpdateStatusBar();; 
UpdateToolBar();; 


private void FrmTV_SizeChanged(object sender,  System.EventArgs e) 

if (m_objVideoWindow != null) 

m_objVideoWindow.SetWindowPosition(panel1.ClientRectangle.Left, 
panel1.ClientRectangle.Top, 
panel1.ClientRectangle.Width, 
panel1.ClientRectangle.Height);; 



private void timer1_Tick(object sender,  System.EventArgs e) 


if (m_CurrentStatus == MediaStatus.Running) 

UpdateStatusBar();; 


protected override void WndProc( ref Message m) 

if (m.Msg == WM_GRAPHNOTIFY) 

int lEventCode;; 
int lParam1, lParam2;; 

while (true) 

try 

m_objMediaEventEx.GetEvent(out lEventCode, 
out lParam1, 
out lParam2, 
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(ref m);; 


private void UpdateStatusBar() 

switch (m_CurrentStatus) 

case MediaStatus.None : statusBarPanel1.Text = "停止";; break;; 
case MediaStatus.Paused : statusBarPanel1.Text = "暂停 ";; break;; 
case MediaStatus.Running: statusBarPanel1.Text = "播放";; break;; 
case MediaStatus.Stopped: statusBarPanel1.Text = "停止";; 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.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";; 



private void UpdateToolBar() 

switch (m_CurrentStatus) 

case MediaStatus.None : toolBarButton1.Enabled = false;; 
toolBarButton2.Enabled = false;; 
toolBarButton3.Enabled = false;; 
break;; 

case MediaStatus.Paused : toolBarButton1.Enabled = true;; 
toolBarButton2.Enabled = false;; 
toolBarButton3.Enabled = true;; 
break;; 

case MediaStatus.Running: toolBarButton1.Enabled = false;; 
toolBarButton2.Enabled = true;; 
toolBarButton3.Enabled = true;; 
break;; 

case MediaStatus.Stopped: toolBarButton1.Enabled = true;; 
toolBarButton2.Enabled = false;; 
toolBarButton3.Enabled = false;; 
break;; 





}  
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值