您的位置:首页 > 编程语言 > C#

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

2007-03-24 11:32 876 查看
使用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;;
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: