使用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);
            }
        }
 
    }
}

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

  1. c#中用DirectShow实现媒体播放器的核心(1) DirectShow简介

    用.net做多媒体开发的似乎不多,所以网上资源也少,看的人更少.不过我的博客上居然还有几位在等新文章的人,有点出乎我的意料了.目前我已不再从事多媒体相关的工作,加入新公司至今都忙到吐血,再加上害怕水平 ...

  2. WinForm媒体播放器

    媒体播放控件(Windows Media Player )的常用属性和方法,并且利用它设计一个简单的媒体应用程序——媒体播放器.该媒体播放器可以播放 wav.avi.mid 和 mp3 等格式的文件. ...

  3. JavaScript自定义媒体播放器

    使用<audio>和<video>元素的play()和pause()方法,可以手工控制媒体文件的播放.组合使用属性.事件和这两个方法,很容易创建一个自定义的媒体播放器,如下面的 ...

  4. (原创)jQuery Media Plugin-jQuery的网页媒体播放器插件的使用心得

    jQuery Media Plugin是一款基于jQuery的网页媒体播放器插件,它支持大部分的网络多媒体播放器和多媒体格式,比如:Flash, Windows Media Player, Real ...

  5. Plyr – 简单,灵活的 HTML5 媒体播放器

    Plyr 是一个简单的 HTML5 媒体播放器,包含自定义的控制选项和 WebVTT 字幕.它是只支持现代浏览器,轻量,方便和可定制的媒体播放器.还有的标题和屏幕阅读器的全面支持. 在线演示      ...

  6. 【C语言入门教程】4.10 综合实例 - 媒体播放器

    4.10.1 建立播放列表 数据字典 名称 数据类型 说明 MAX_LENGTH 符号常量 用于定义数组长度,表示列表最大长度 MAX_FILE_LENGTH 符号常量 用于定义数组长度,表示文件名最 ...

  7. 快速构建Windows 8风格应用21-构建简单媒体播放器

    原文:快速构建Windows 8风格应用21-构建简单媒体播放器 本篇博文主要介绍如何构建一个简单的媒体播放器. <快速构建Windows 8风格应用20-MediaElement>博文中 ...

  8. Movist for Mac(高清媒体播放器)v2.0.7中文特别版

    Movist for Mac中文破解版是目前Mac平台上最好用的视频播放器,功能强大简单好用.movist mac版拥有美观简洁的用户界面,提供多种功能,支持视频解码加速高品质的字幕,全屏幕浏览,是与 ...

  9. VLC 媒体播放器

    VLC 媒体播放器 VLC 媒体播放器是一个便携式. 免费.开源. 跨平台的媒体播放器. VideoLAN 项目的流式媒体服务器.分为Windows Phone版本和Android版本. 下载地址: ...

随机推荐

  1. Linux /dev 自动创建设备节点

    #include <linux/module.h> #include <linux/module.h> #include <linux/kernel.h> #inc ...

  2. makefile教程网址

    http://www.cnblogs.com/wang_yb/p/3990952.html

  3. cppcheck使用

    一.splint介绍 splint是一个动态检查C语言程序安全弱点和编写错误的程序.splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未 ...

  4. 使用PHP计算上一个月的今天

    一日,遇到一个问题,求上一个月的今天. 最开始我们使用 strtotime(“-1 month”) 函数求值,发现有一个问题,月长度不一样的月份的计算结果有误. 比如:2011-03-31,得到的结果 ...

  5. JAVA equals, ==

    都是判相等,对于基本变量没区别,只是对动态变量(即对象)有区别: ==:引用相等(reference comparison).对于对象引用,即判断引用值也就是地址是否相等.即如果Object a,b, ...

  6. 深入理解ThreadLocal(一)

    Android里,在不同的线程(假设子线程已经创建了Looper)中创建Handler时,并不需要显式指定Looper,系统能自动找到该线程自己的Looper.不同线程的Looper相互独立,之所以能 ...

  7. Aspose 导出excel小demo

    //转为pdf         private void CelltoPDF(string cellPath, string pdfPath)         {             Workbo ...

  8. 设置NODE_ENV=production

    NodeJS - Express 4.0下设置环境变量NODE_ENV=production,并不是修改文件的配置信息,而是通过命令行来实现. 首先在命令行下进入项目的目录,然后先后执行如下命令: s ...

  9. nodejs小问题:express不是内部或外部命令(转载)

    安装express之后发现居然提示express不是内部或外部命令. 工具/原料 Node.js安装包 方法/步骤 1 首先下载Node.js安装包,此处我用的是官方最新的v0.10.27 32位版: ...

  10. 一个完整openlayer的例子,包括marker,popup等

    整理转自:http://www.blogjava.net/siriusfx/archive/2007/11/26/163104.html openlayers提供了几十个示例,虽然每个示例都很简单,但 ...