C#中用API实现MP3等音频文件的播放类

C#没有提供播放MP3等音频文件的类,要编写播放MP3等音频文件程序,必须使用第三方控件或类.本文使用API函数mciSendString,编写一个播放MP3等音频文件的类.
    具体源码如下:
    一、使用API函数mciSendString构成的媒体播放类.


using System;
using System.Runtime.InteropServices;
using System.Text;
using System.IO ;
namespace clsMCIPlay
{
   
/// <summary> 
   
/// clsMci 的摘要说明. 
   
/// </summary> 
    public class clsMCI 
    {
        public clsMCI( )
        {
           
//
           
// TODO: 在此处添加构造函数逻辑
           
//
        }
       
//定义API函数使用的字符串变量
        [MarshalAs( UnmanagedType.ByValTStr,SizeConst=260 )]
        private
        string Name = "" ;
        [MarshalAs( UnmanagedType.ByValTStr,SizeConst=128 )]
        private
        string durLength = "" ;
        [MarshalAs( UnmanagedType.LPTStr,SizeConst=128 )]
        private
        string TemStr ="";
       
        int ilong;
       
//定义播放状态枚举变量
        public enum State
        {
            mPlaying = 1,
            mPuase = 2,
            mStop = 3
        }
        ;
       
//结构变量
        public struct structMCI
        {
            public bool bMut;
           
            public
            int iDur;
           
            public
            int iPos;
           
            public
            int iVol;
           
            public
            int iBal;
           
            public
            string iName;
           
            public State state;
        }
        ;
       
        public structMCI mc =new structMCI( ) ;
       
//取得播放文件属性
        public
        string FileName
        {
            get
            {
                return mc.iName;
            }
            set
            {
               
//ASCIIEncoding asc = new ASCIIEncoding( );
                try
                {
                    TemStr ="";
                    TemStr = TemStr.PadLeft( 127,Convert.ToChar( " " ) );
                    Name = Name.PadLeft( 260,Convert.ToChar( " " ) ) ;
                    mc.iName = value;
                    ilong = APIClass.GetShortPathName( mc.iName,Name, Name.Length );
                    Name = GetCurrPath( Name );
                   
//Name = "open " + Convert.ToChar( 34 ) + Name + Convert.ToChar( 34 ) + " alias media";
                    Name = "open " + Convert.ToChar( 34 ) + Name + Convert.ToChar( 34 ) + " alias media";
                    ilong = APIClass.mciSendString( "close all", TemStr, TemStr.Length , 0 );
                    ilong = APIClass.mciSendString(Name, TemStr, TemStr.Length, 0 );
                    ilong = APIClass.mciSendString( "set media time format milliseconds", TemStr, TemStr.Length , 0 );
                    mc.state = State.mStop;
                }
                catch
                {
                    MessageBox.Show( "出错错误!" );
                }
            }
        }
       
//播放
        public void play( )
        {
            TemStr = "";
            TemStr = TemStr.PadLeft( 127,Convert.ToChar( " " ) );
            APIClass.mciSendString( "play media", TemStr, TemStr.Length , 0 );
            mc.state = State.mPlaying ;
        }
       
//停止
        public void StopT( )
        {
            TemStr = "";
            TemStr = TemStr.PadLeft( 128,Convert.ToChar( " " ) );
            ilong = APIClass.mciSendString( "close media", TemStr, 128, 0 );
            ilong = APIClass.mciSendString( "close all", TemStr, 128, 0 );
            mc.state = State.mStop ;
        }
       
        public void Puase( )
        {
            TemStr = "";
            TemStr = TemStr.PadLeft( 128,Convert.ToChar( " " ) );
            ilong = APIClass.mciSendString( "pause media", TemStr, TemStr.Length, 0 );
            mc.state = State.mPuase ;
        }
       
        private
        string GetCurrPath(
        string name )
        {
            if( name.Length <1 ) return "";
            name = name.Trim( );
            name = name.Sub
            string( 0,name.Length-1 );
            return name;
        }
       
//总时间
        public
        int Duration
        {
            get
            {
                durLength = "";
                durLength = durLength.PadLeft( 128,Convert.ToChar( " " ) ) ;
                APIClass.mciSendString( "status media length", durLength, durLength.Length, 0 );
                durLength = durLength.Trim( );
                if( durLength == "" ) return 0;
                return (
                int )( Convert.ToDouble( durLength ) / 1000f );
            }
        }
       
//当前时间
        public
        int CurrentPosition
        {
            get
            {
                durLength = "";
                durLength = durLength.PadLeft( 128,Convert.ToChar( " " ) ) ;
                APIClass.mciSendString( "status media position", durLength, durLength.Length, 0 );
                mc.iPos = (
                int )( Convert.ToDouble( durLength ) / 1000f );
                return mc.iPos;
            }
        }
    }
   
    public class APIClass 
    {
        [DllImport( "kernel32.dll", CharSet = CharSet.Auto )]
        public static extern
        int GetShortPathName (
        string lpszLongPath,
        string shortFile,
        int cchBuffer
        );
        [DllImport( "winmm.dll", EntryPo
        int="mciSendString", CharSet = CharSet.Auto )]
        public static extern
        int mciSendString (
        string lpstrCommand,
        string lpstrReturnString,
        int uReturnLength,
        int hwndCallback
        );
    }
}
二、用于测试媒体播放类的简单代码:


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using System.Text;
using System.IO ;
using clsMCIPlay;
namespace MCIPlay
{
   
/// <summary> 
   
/// Form1 的摘要说明. 
   
/// </summary> 
    public class Form1 : System.Windows.Forms.Form 
    {
        private System.ComponentModel.IContainer components;
       
        private System.Windows.Forms.Timer timer1;
       
        private System.Windows.Forms.Button Play;
       
        private System.Windows.Forms.Button Stop;
       
        private System.Windows.Forms.Button Puase;
       
        private System.Windows.Forms.Label PlayFileName;
       
        private System.Windows.Forms.Label Duration;
       
        private System.Windows.Forms.Label CurrentPosition;
       
        private System.Windows.Forms.OpenFileDialog openFileDialog1;
       
        private System.Windows.Forms.Button BrowserFile;
        clsMCI mp = new clsMCI( );
       
        public Form1( )
        {
           
//
           
// Windows 窗体设计器支持所必需的
           
//
            InitializeComponent( );
           
//
           
// TODO: 在
            InitializeComponent 调用后添加任何构造函数代码
           
//
        }
       
       
/// <summary>
       
/// 清理所有正在使用的资源.
       
/// </summary>
        protected override void Dispose(bool disposing)
        {
            if(disposing)
            {
                if ( components != null )
                {
                    components.Dispose( );
                }
            }
            base.Dispose(disposing);
        }
        #region Windows 窗体设计器生成的代码
       
/// <summary>
       
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
       
/// 此方法的内容.
       
/// </summary>
        private void
        InitializeComponent( )
        {
            this.components = new System.ComponentModel.Container( );
           
            this.Play = new System.Windows.Forms.Button( );
           
            this.PlayFileName = new System.Windows.Forms.Label( );
           
            this.Duration = new System.Windows.Forms.Label( );
           
            this.Stop = new System.Windows.Forms.Button( );
           
            this.Puase = new System.Windows.Forms.Button( );
           
            this.CurrentPosition = new System.Windows.Forms.Label( );
           
            this.timer1 = new System.Windows.Forms.Timer(
            this.components );
           
            this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog( );
           
            this.BrowserFile = new System.Windows.Forms.Button( );
           
            this.SuspendLayout( );
           
//
           
// Play
           
//
            this.Play.Location = new System.Drawing.Po
            int( 102, 243 );
           
            this.Play.Name = "Play";
           
            this.Play.Size = new System.Drawing.Size( 78, 24 );
           
            this.Play.TabIndex = 0;
           
            this.Play.Text = "Play";
           
            this.Play.Click += new System.EventHandler(
            this.Play_Click );
           
//
           
// PlayFileName
           
//
            this.PlayFileName.AutoSize = true;
           
            this.PlayFileName.Location = new System.Drawing.Po
            int( 12, 15 );
           
            this.PlayFileName.Name = "PlayFileName";
           
            this.PlayFileName.Size = new System.Drawing.Size( 0, 17 );
           
            this.PlayFileName.TabIndex = 1;
           
//
           
// Duration
           
//
            this.Duration.AutoSize = true;
           
            this.Duration.Location = new System.Drawing.Po
            int( 15, 51 );
           
            this.Duration.Name = "Duration";
           
            this.Duration.Size = new System.Drawing.Size( 0, 17 );
           
            this.Duration.TabIndex = 2;
           
//
           
// Stop
           
//
            this.Stop.Location = new System.Drawing.Po
            int( 282, 243 );
           
            this.Stop.Name = "Stop";
           
            this.Stop.Size = new System.Drawing.Size( 81, 24 );
           
            this.Stop.TabIndex = 3;
           
            this.Stop.Text = "Stop";
           
            this.Stop.Click += new System.EventHandler(
            this.Stop_Click );
           
//
           
// Puase
           
//
            this.Puase.Location = new System.Drawing.Po
            int( 198, 243 );
           
            this.Puase.Name = "Puase";
           
            this.Puase.Size = new System.Drawing.Size( 72, 24 );
           
            this.Puase.TabIndex = 4;
           
            this.Puase.Text = "Puase";
           
            this.Puase.Click += new System.EventHandler(
            this.Puase_Click );
           
//
           
// CurrentPosition
           
//
            this.CurrentPosition.AutoSize = true;
           
            this.CurrentPosition.Location = new System.Drawing.Po
            int( 15, 87 );
           
            this.CurrentPosition.Name = "CurrentPosition";
           
            this.CurrentPosition.Size = new System.Drawing.Size( 0, 17 );
           
            this.CurrentPosition.TabIndex = 5;
           
//
           
// timer1
           
//
            this.timer1.Enabled = true;
           
            this.timer1.Interval = 1000;
           
            this.timer1.Tick += new System.EventHandler(
            this.timer1_Tick );
           
//
           
// BrowserFile
           
//
            this.BrowserFile.Location = new System.Drawing.Po
            int( 312, 165 );
           
            this.BrowserFile.Name = "BrowserFile";
           
            this.BrowserFile.Size = new System.Drawing.Size( 87, 24 );
           
            this.BrowserFile.TabIndex = 6;
           
            this.BrowserFile.Text = "SelectFile";
           
            this.BrowserFile.Click += new System.EventHandler(
            this.BrowserFile_Click );
           
//
           
// Form1
           
//
            this.AutoScaleBaseSize = new System.Drawing.Size( 6, 14 );
           
            this.ClientSize = new System.Drawing.Size( 433, 287 );
           
            this.Controls.Add(
            this.BrowserFile );
           
            this.Controls.Add(
            this.CurrentPosition );
           
            this.Controls.Add(
            this.Puase );
           
            this.Controls.Add(
            this.Stop );
           
            this.Controls.Add(
            this.Duration );
           
            this.Controls.Add(
            this.PlayFileName );
           
            this.Controls.Add(
            this.Play );
           
            this.Name = "Form1";
           
            this.Text = "Form1";
           
            this.ResumeLayout( false );
        }
        #endregion
       
/// <summary>
       
/// 应用程序的主入口点.
       
/// </summary>
        [STAThread]
        static void Main( )
        {
            Application.Run( new Form1( ) );
        }
       
//选择MP3文件播放
        private void Play_Click( object sender, System.EventArgs e )
        {
            try
            {
                mp.play( );
            }
            catch
            {
                MessageBox.Show( "出错错误!" );
            }
        }
       
//暂停播放
        private void Puase_Click( object sender, System.EventArgs e )
        {
            try
            {
                mp.Puase( );
            }
            catch
            {
                MessageBox.Show( "出错错误!" );
            }
        }
       
//停止播放
        private void Stop_Click( object sender, System.EventArgs e )
        {
            try
            {
                mp.StopT( );
            }
            catch
            {
                MessageBox.Show( "出错错误!" );
            }
        }
       
//每秒显示一次播放进度
        private void timer1_Tick( object sender, System.EventArgs e )
        {
            CurrentPosition.Text = mp.CurrentPosition.ToString( );
        }
       
//浏览文件
        private void BrowserFile_Click( object sender, System.EventArgs e )
        {
            try
            {
                openFileDialog1.Filter = "*.mp3|*.mp3";
                openFileDialog1.FileName = "";
                if( openFileDialog1.ShowDialog( ) == DialogResult.OK )
                {
                    mp.FileName = openFileDialog1.FileName ;
                    PlayFileName.Text = openFileDialog1.FileName ;
                    Duration.Text = mp.Duration.ToString( ) ;
                }
            }
            catch
            {
                MessageBox.Show( "出错错误!" );
            }
        }
    }
}
本程序在.net 2003 、win XP SP1下编译通过.

posted @ 2006-12-05 09:49  远方  阅读(558)  评论(0编辑  收藏  举报