MP3 辅助类






4.80/5 (9投票s)
一个 MP3 辅助类,

引言
对于许多 .NET 开发者来说,在应用程序中播放 MP3 文件,无论是嵌入式文件还是单独的系统文件,一直是一个问题。
根据 MSDN 的说法,您可以启动或嵌入 WMP10(使用 WMP10SDK)到您的应用程序中,然后告诉它通过该方式播放文件,或者您可以使用 DirectX SDK 通过 DirectX 在您的应用程序中播放音频。
在本文中,我们将讨论使用 winmm.dll 播放 MP3。
背景
加载 Winmm.dll 时的性能问题
根据微软的说法,当您的 Windows 2000 系统加载 Winmm.dll 文件到内存时,您可能会遇到延迟。此延迟可能发生在不同的时间,具体取决于 Winmm.dll 文件的加载方式。
如果程序使用导入库加载 Winmm.dll 文件“就像本文中管理的那样”,Winmm.dll 将在程序启动时加载。在这种情况下,您可能会在启动程序时遇到延迟。如果使用批处理文件多次启动程序,性能可能会受到严重影响,所以不要这样做。
如果程序使用 LoadLibrary
加载 Winmm.dll 文件,Winmm.dll 仅在程序需要使用它时才会被加载,而这,我的朋友们,是更好的方法。为了简单起见,我们讨论的是更基本和更慢的方法,但您可以随时参考文章 使用 C# 进行本机 DLL 的后期绑定 以获取更有效的方法。
Using the Code
助手类是一个简单的类,其中包含几个有用的 public static
方法来控制正在播放的文件... 再次说明,这个类非常简单和直接,所以如果您觉得需要添加一些额外的函数或属性,例如一个布尔标志或一个枚举器来告诉您文件的当前状态“例如,正在播放、暂停或停止”,请随时添加。
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace QSoft
{
class MP3Helper
{
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand,
System.Text.StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
public static void Play(string MP3_FileName,bool Repeat)
{
mciSendString("open \"" + MP3_FileName + "\" type mpegvideo alias MediaFile",
null, 0, IntPtr.Zero);
mciSendString("play MediaFile" + (Repeat ? " repeat" :String.Empty), null,
0, IntPtr.Zero);
}
public static void Play(byte[] MP3_EmbeddedResource, bool Repeat)
{
extractResource(MP3_EmbeddedResource, Path.GetTempPath() + "resource.tmp");
mciSendString("open \"" + Path.GetTempPath() + "resource.tmp" +
"\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
mciSendString("play MediaFile" + (Repeat ? " repeat" : String.Empty),
null, 0, IntPtr.Zero);
}
public static void Pause()
{
mciSendString("stop MediaFile", null, 0, IntPtr.Zero);
}
public static void Stop()
{
mciSendString("close MediaFile", null, 0, IntPtr.Zero);
}
private static void extractResource(byte[] res,string filePath)
{
FileStream fs;
BinaryWriter bw;
if (!File.Exists(filePath))
{
fs = new FileStream(filePath, FileMode.OpenOrCreate);
bw = new BinaryWriter(fs);
foreach (byte b in res)
bw.Write(b);
bw.Close();
fs.Close();
}
}
}
}
播放系统文件很简单,您只需要指定系统的名称即可。我们使用重载的 Play
方法调用它。
QSoft.MP3Helper.Play(txtAudioFile.Text, true);
public static void Play(string MP3_FileName,bool Repeat)
{
mciSendString("open \"" + MP3_FileName + "\" type mpegvideo alias MediaFile",
null, 0, IntPtr.Zero);
mciSendString("play MediaFile" + (Repeat ? " repeat" :String.Empty), null,
0, IntPtr.Zero);
}
但是,播放嵌入式资源文件有点棘手,因为您首先需要将其提取到临时文件,然后将其作为简单的系统文件读取。
extractResource
通过将您的音乐文件作为字节数组作为第一个参数,以及目标临时文件的完整限定名称,来执行提取操作。
private static void extractResource(byte[] res,string filePath)
{
FileStream fs;
BinaryWriter bw;
if (!File.Exists(filePath))
{
fs = new FileStream(filePath, FileMode.OpenOrCreate);
bw = new BinaryWriter(fs);
foreach (byte b in res)
bw.Write(b);
bw.Close();
fs.Close();
}
}
我们使用重载的 Play
方法调用它
QSoft.MP3Helper.Play(Properties.Resources.YourMp3File, true);
public static void Play(byte[] MP3_EmbeddedResource, bool Repeat)
{
extractResource(MP3_EmbeddedResource, Path.GetTempPath() + "resource.tmp");
mciSendString("open \"" + Path.GetTempPath() + "resource.tmp" +
"\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
mciSendString("play MediaFile" + (Repeat ? " repeat" : String.Empty),
null, 0, IntPtr.Zero);
}
要停止和暂停文件,我们分别使用 MP3Helper .Stop()
和 MP3Helper.Pause
。
public static void Pause()
{
mciSendString("stop MediaFile", null, 0, IntPtr.Zero);
}
public static void Stop()
{
mciSendString("close MediaFile", null, 0, IntPtr.Zero);
}
实现表单代码使用传统的按钮禁用技术来防止播放已经正在播放的文件“您可以随意添加您的布尔标志/枚举器状态以进行更好的检查”。
using System;
using System.Windows.Forms;
using System.IO;
namespace MP3Helper
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnPlay_Click(object sender, EventArgs e)
{
if(rdSystemFile.Checked)
if (txtAudioFile.Text.Length > 0 && File.Exists(txtAudioFile.Text))
{
QSoft.MP3Helper.Play(txtAudioFile.Text, true);
btnPlay.Enabled = false;
btnPause.Enabled = true;
btnStop.Enabled = true;
}
if (rdResourceFile.Checked)
{
QSoft.MP3Helper.Play(Properties.Resources.Shakira___Waka_Waka, true);
btnPlay.Enabled = false;
btnPause.Enabled = true;
btnStop.Enabled = true;
}
}
private void btnPause_Click(object sender, EventArgs e)
{
QSoft.MP3Helper.Pause();
btnPlay.Text = "Resume";
btnPlay.Enabled = true;
btnPause.Enabled = false;
btnStop.Enabled = true;
}
private void btnStop_Click(object sender, EventArgs e)
{
QSoft.MP3Helper.Stop();
btnPlay.Text = "Play";
btnPlay.Enabled = true;
btnPause.Enabled = false;
btnStop.Enabled = false;
}
private void lnkBrowse_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
openFileDialog1.Filter =
"mp3 files|*.mp3|wave files|*.wav|rm files|*.rm|All files|*.*";
openFileDialog1.ShowDialog();
txtAudioFile.Text = openFileDialog1.FileName;
}
private void rdResourceFile_CheckedChanged(object sender, EventArgs e)
{
if (rdResourceFile.Checked)
{
lnkBrowse.Enabled = false;
txtAudioFile.Enabled = false;
QSoft.MP3Helper.Stop();
btnPlay.Text = "Play";
btnPlay.Enabled = true;
btnPause.Enabled = false;
btnStop.Enabled = false;
}
}
private void rdSystemFile_CheckedChanged(object sender, EventArgs e)
{
if (rdSystemFile.Checked)
{
lnkBrowse.Enabled = true;
txtAudioFile.Enabled = true;
//Stopping resource
QSoft.MP3Helper.Stop();
btnPlay.Text = "Play";
btnPlay.Enabled = true;
btnPause.Enabled = false;
btnStop.Enabled = false;
}
}
}
}
历史
- 2010 年 7 月 23 日:初始发布