C#中用API实现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下编译通过.