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

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


作者: vbprog  出处: CSDN    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.Substring(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", EntryPoint="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.Point(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.Point(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.Point(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.Point(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.Point(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.Point(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.Point(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下编译通过。  (2005-6-08:04:31)
 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 警告:持续变种木马正在发起农历新年攻势!
 您可能对 [C#] 的这些文章也感兴趣:
C#开源项目
论C#变得越来越臃肿是不可避免的
在WinForm的DataGrid中添加按钮列
利用C#远程存取Access数据库
c#调用oracle存储过程返回结果集及函数
C#制作MDI窗体
C#泛型集合揽胜
C#中如何调用Delphi写的Dll
在C#程序中嵌套播放器
扩展方法、DSL和连贯接口
C# 学习使用ErrorProvider
实例 C# 学习使用StatusStrip