zoukankan      html  css  js  c++  java
  • C#编写媒体播放器--Microsoft的Directx提供的DirectShow组件,该组件的程序集QuartzTypeLib.dll.

    使用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);
                }
            }
     
        }
    }
  • 相关阅读:
    linux 运维
    mariadb replication
    phpmyadmin
    Objective-C设计模式——单例Singleton(对象创建)
    收藏iOS学习资料
    axios拦截器
    vue单页面优化
    html设置http缓存代码
    js数组去重,排序的几种方法
    前端移动端问题
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/5698685.html
Copyright © 2011-2022 走看看