C#编写媒体播放器--Microsoft的Directx提供的DirectShow组件,该组件的程序集QuartzTypeLib.dll.

时间:2022-04-08 04:57:52

使用C#编写媒体播放器时,需要用到Microsoft的Directx提供的DirectShow组件.用该组件前需要先注册程序集QuartzTypeLib.dll.

1、用QuartzTypeLib.dll播放视频(http://i.cnblogs.com/Files.aspx下载类库)

1.1Form1.cs
 
using System;
using System.Windows.Forms;
using QuartzTypeLib; 
namespace DirectShow
{
    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 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_objMediaEventEx = null;
        IMediaPosition m_objMediaPosition = null;
        IMediaControl m_objMediaControl = null;
        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;
                        }
                    }
                    catch (Exception)
                    {
                        break;
                    }
                }
            }
            base.WndProc(ref m);
        }
        private void Clear()
        {
            if (m_objMediaControl != null)
                m_objMediaControl.Stop();
            if (m_objMediaEventEx != null)
                m_objMediaEventEx.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_objMediaEventEx != null) m_objMediaEventEx = 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();
                try
                {
                    m_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
                {
                    //MessageBox.Show(ex.Message);
                    //当出错时,为音频文件,将视频对象清空
                    m_objVidwoWindow = 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 = openFile.FileName + "----" this.Text;
                m_objMediaControl.Run(); //播放文件
                try
                {
                    trackBar1.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;
            else
                m_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;
        }
    }
}
 
1.2 Form1.Designer.cs
 
namespace DirectShow
{
    partial class Form1
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        #region Windows 窗体设计器生成的代码
        /// <summary>
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.components = 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(this.components);
            ((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.button5.UseVisualStyleBackColor = true;
            this.button5.Click += new System.EventHandler(this.button5_Click);
            //
            // button6
            //
            this.button6.Location = new System.Drawing.Point(250, 254);
            this.button6.Name = "button6";
            this.button6.Size = new System.Drawing.Size(75, 23);
            this.button6.TabIndex = 5;
            this.button6.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.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.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(496, 280);
            this.Controls.Add(this.button6);
            this.Controls.Add(this.button5);
            this.Controls.Add(this.button4);
            this.Controls.Add(this.button3);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.trackBar1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
            this.Name = "Form1";
            this.Text = "多媒体播放器";
            ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();
 
        }
        #endregion
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.Button button3;
        private System.Windows.Forms.Button button4;
        private System.Windows.Forms.Button button5;
        private System.Windows.Forms.Button button6;
        private System.Windows.Forms.TrackBar trackBar1;
        private System.Windows.Forms.Timer timer1;
    }
}
 
1.3 Program.cs
 
using System;
using System.Windows.Forms; 
namespace DirectShow
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

2、播放选定的文件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace MediaApp
{
    public partial class Form1 : Form
    {
        private const int WS_CHILD = 0x40000000;
        private const int WS_CLIPCHILDREN = 0x2000000;
        private QuartzTypeLib.IMediaControl MyControl = null;
        private QuartzTypeLib.IVideoWindow MyWindow = null;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog MyDialog = new OpenFileDialog();
            MyDialog.Filter = "Media Files|*.mpg;*.avi;*.wma;*.mov;*.wav;*.mp2;*.mp3|All Files|*.*";
            if (MyDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    QuartzTypeLib.FilgraphManager MyManager = new QuartzTypeLib.FilgraphManager();
                    if (MyControl != null) MyControl.Stop();//如果已经播放过,则先停止
                    MyManager.RenderFile(MyDialog.FileName);//加载音频、视频文件
                    MyWindow = (QuartzTypeLib.IVideoWindow)MyManager;
                    try//音频文件不需要用pictureBox1,所以会报错
                    {
                        MyWindow.Owner = (int)pictureBox1.Handle;
                        MyWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;
                        MyWindow.SetWindowPosition(pictureBox1.ClientRectangle.Left,
                        pictureBox1.ClientRectangle.Top,pictureBox1.ClientRectangle.Width,pictureBox1.ClientRectangle.Height);
                    }
                    catch { }
                    MyControl = (QuartzTypeLib.IMediaControl)MyManager;
                    MyControl.Run();
                }
                catch(Exception Mye)
                {
                    MessageBox.Show(this,Mye.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            }
        }
    }
}  
 

2、播放指定的文件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms; 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private const int WS_CHILD = 0x40000000;
        private const int WS_CLIPCHILDREN = 0x2000000;
        private QuartzTypeLib.IMediaControl MyControl = null;
        private QuartzTypeLib.IVideoWindow MyWindow = null;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
 
                QuartzTypeLib.FilgraphManager MyManager = new QuartzTypeLib.FilgraphManager();
 
                if (MyControl != null) MyControl.Stop();//如果已经播放过,则先停止
                MyManager.RenderFile("Ending.mpg");//加载音频、视频文件
                MyWindow = (QuartzTypeLib.IVideoWindow)MyManager;
                try//音频文件不需要用pictureBox1,所以会报错
                {
                    MyWindow.Owner = (int)pictureBox1.Handle;
                    MyWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;
                    MyWindow.SetWindowPosition(pictureBox1.ClientRectangle.Left,
                    pictureBox1.ClientRectangle.Top, pictureBox1.ClientRectangle.Width, pictureBox1.ClientRectangle.Height);
                }
                catch { }
                MyControl = (QuartzTypeLib.IMediaControl)MyManager;
                MyControl.Run();
 
            }
            catch (Exception Mye)
            {
                MessageBox.Show(this, Mye.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
 
    }
}