zoukankan      html  css  js  c++  java
  • 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.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("出错错误!");
      }
    }
      }
    }
  • 相关阅读:
    UVA 11021繁衍模型+概率计算
    LA 5059博弈+SG函数
    LA 3942 字典树
    Beat---hdu2614
    Wooden Sticks---hdu1051(最长上升子序列)
    欧拉函数基础
    1370
    钱币兑换问题---hdu1284(完全背包)
    Drainage Ditches--hdu1532(网络流 模板)
    Fibonacci--poj3070(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/jordan2009/p/1553993.html
Copyright © 2011-2022 走看看