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

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

1、用QuartzTypeLib.dll播放视频

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

            }

        }

    }

}

时间: 2024-10-11 09:03:21

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

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

用.net做多媒体开发的似乎不多,所以网上资源也少,看的人更少.不过我的博客上居然还有几位在等新文章的人,有点出乎我的意料了.目前我已不再从事多媒体相关的工作,加入新公司至今都忙到吐血,再加上害怕水平不够误人子弟,所以一直都没有更新这个系列.但是之前有承诺过得着空就一定要更新,现在总算稍微空了那么一点点,继续烂着这个坑的理由就没有了. DirectShow是微软平台上处理多媒体相关事务的一个平台,本身是基于COM技术上的框架,所以可以和.net配合的非常好.在这套框架里,多媒体相关事务被分成一个

c#开发的媒体播放器

在Microsoft Visual C# .NET 中使用 DirectShow 控件,来开发一个媒体播放器.按照本文介绍的操作步骤,您可以创建一个简单 Visual C# 应用程序,用来播放数字音频和视频. 介绍 Microsoft Visual C# 是世界上最流行的编程语言,利用 Visual C# 的最新版本 Visual C# .NET,您能够快速.有效地开发基于 Windows 窗体的应用程序,还可以为嵌入了 Microsoft Windows Media? Player 9 Ser

【转】媒体播放器三大底层架构

媒体播放工具,这里主要指视频播放,因为要面临庞大的兼容性和纷繁复杂的算法,从架构上看,能脱颖而出的体系屈指可数.大体来说业界主要有3大架构:MPC.MPlayer和VLC.这3大架构及其衍生品占领了90%的市场,凡是用户能看到的免费媒体播放软件,无一不是源自这3大架构. MPC-HC架构  MPC(Media Player Classic)和它的后续者MPC-HC应该并列而说.MPC基于DirectShow架构,是Windows系统下元祖级别的播放器.包括KMP之流 最早也就是抄来MPC的代码再

媒体播放器三大底层架构

自射手影音推出以来,生活中越来越多的时间开始被代码和各种Bug-Fix淹没.埋头在田里太久,常常会在一时之间忘记身处何方.所以偶尔上来透透气,顺便将一些经验和心得与大家分享. 媒体播放工具,这里主要指视频播放,因为要面临庞大的兼容性和纷繁复杂的算法,从架构上看,能脱颖而出的体系屈指可数.大体来说业界主要有3大架构:MPC.MPlayer和VLC.这3大架构及其衍生品占领了90%的市场,凡是用户能看到的免费媒体播放软件,无一不是源自这3大架构. MPC/HC架构 MPC(Media Player

转:媒体播放器三大底层架构

媒体播放工具,这里主要指视频播放,因为要面临庞大的兼容性和纷繁复杂的算法,从架构上看,能脱颖而出的体系屈指可数.大体来说业界主要有3大架 构:MPC.MPlayer和VLC.这3大架构及其衍生品占领了90%的市场,凡是用户能看到的免费媒体播放软件,无一不是源自这3大架构.? ? MPC-HC架构? MPC(Media Player Classic)和它的后续者MPC-HC应该并列而说.MPC基于DirectShow架构,是Windows系统下元祖级别的播放器.包括KMP之流 最早也就是抄来MPC

QtQuick2实现媒体播放器(界面)

这里提供一个QtQuick2实现媒体播放器(界面).供大家学习的啦~ 先看效果图:播放器启动后的界面,部分图标来自互联网. 打开媒体文件 播放文件 快捷键控制Ctrl+H: 隐藏/显示 播放栏 当鼠标悬停在一些按钮上时可以显示提示. 关于 源代码包&程序点这里下载

简单媒体播放器

// //  ViewController.m //  简单媒体播放器 // //  Created by 殷婷婷 on 15-6-12. //  Copyright (c) 2015年 lanou. All rights reserved. // #import "ViewController.h" #import <MediaPlayer/MediaPlayer.h> @interface ViewController () @property(nonatomic,st

JavaScript自定义媒体播放器

使用<audio>和<video>元素的play()和pause()方法,可以手工控制媒体文件的播放.组合使用属性.事件和这两个方法,很容易创建一个自定义的媒体播放器,如下面的例子所示. 1 <div class="mediaplayer"> 2 <div class="video"> 3 <video id="player" src="movie.mov" poster=

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

jQuery Media Plugin是一款基于jQuery的网页媒体播放器插件,它支持大部分的网络多媒体播放器和多媒体格式,比如:Flash, Windows Media Player, Real Player, Quicktime, MP3,Silverlight, PDF.它根据当前的脚本配置,自动将a标签替换成div,并生成object, embed甚至是iframe代码,至于生成object还是embed,jQuery Media会根据当前平台自动判别,因此兼容性方面非常出色下面这段代