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下编译通过.