C#中用API實現(xiàn)MP3等音頻文件的播放類

字號:

C#沒有提供播放MP3等音頻文件的類,要編寫播放MP3等音頻文件程序,必須使用第三方控件或類。本文使用API函數(shù)mciSendString,編寫一個播放MP3等音頻文件的類。
    具體源碼如下:
    一、使用API函數(shù)mciSendString構(gòu)成的媒體播放類。
    using System;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.IO ;
    namespace clsMCIPlay
    {
    ///
    /// clsMci 的摘要說明。
    ///

    public class clsMCI
    {
    public clsMCI()
    {
    //
    // TODO: 在此處添加構(gòu)造函數(shù)邏輯
    //
    }
    //定義API函數(shù)使用的字符串變量
    [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;
    //定義播放狀態(tài)枚舉變量
    public enum State
    {
    mPlaying = 1,
    mPuase = 2,
    mStop = 3
    };
    //結(jié)構(gòu)變量
    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
    );
    }
    }