使用 winmm.dll 和 WPL 文件的音频播放器





4.00/5 (8投票s)
打开 Windows Media 播放列表并播放它

引言
在寻找一个简单且免费的 MP3 播放器之后,我决定自己制作一个。 我基于一个商业软件包,名字就不说了。[让我们说,考虑到它导入了 *winmm.dll*,该软件包的价格昂贵。] 我发现几乎每个使用 *winmm.dll* 播放音频文件[在我的例子中是 MP3]的示例都只有播放/停止功能(有时是暂停)。 这很好,我只是想要更多一点,并且仍然想保持简单。 当然,如果我想要一个功能齐全的 MP3 播放器,我可能会下载众多免费应用程序中的一个。 那不是我的目的。
所以代码非常简单。 它使用 Windows 中的 *winmm.dll* 来播放、停止、暂停等。它还控制左/右声道的音量(如果有多个)。 此外,我很高兴尝试解析 XML,因此该应用程序从 Windows Media 播放列表获取音频文件信息[创建一个很容易,只需使用 Windows Media Player]。
请记住,我不是一名专业的程序员,这是我对 Code Project 的第一次贡献。 我知道我不是在重新发明轮子,只是希望这能帮助到某人。
该项目有几个文件
- *Player.cs* [它包含所有 *winmm.dll*
string
命令]: 更多信息可以在 这里 找到,但我认为有时很难理解。 - *readPlaylist.cs*:这会打开一个打开对话框窗口,并帮助您选择一个 *.wpl* 文件。
- *MainPlayer.cs*:基本上是按钮和点击事件等。
Player.cs
我尝试在代码中添加尽可能多的相关注释,就像我写这篇文章一样,而不会过度。
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace MP3player
{
class Player
{
private string Pcommand;
private bool isOpen;
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand,
StringBuilder strReturn, int iReturnLength, int bla);
/// <SUMMARY>
/// Not much to construct here
/// </SUMMARY>
public Player()
{
}
/// <SUMMARY>
/// Stops currently playing audio file
/// </SUMMARY>
public void Close()
{
Pcommand = "close MediaFile";
mciSendString(Pcommand, null, 0, 0);
isOpen = false;
}
/// <SUMMARY>
/// Opens audio file to play
/// </SUMMARY>
/// This is the audio file's path and filename
public void Open(string sFileName)
{
Pcommand = "open \"" + sFileName + "\" type mpegvideo alias MediaFile";
mciSendString(Pcommand, null, 0, 0);
isOpen = true;
}
/// <SUMMARY>
/// Plays selected audio file
/// </SUMMARY>
/// If True,audio file will repeat
public void Play(bool loop)
{
if (isOpen)
{
Pcommand = "play MediaFile";
if (loop)
Pcommand += " REPEAT";
mciSendString(Pcommand, null, 0, 0);
}
}
/// <SUMMARY>
/// Pauses currently playing audio file
/// </SUMMARY>
public void Pause()
{
Pcommand = "pause MediaFile";
mciSendString(Pcommand, null, 0, 0);
}
/// <SUMMARY>
/// Returns the current status player: playing, paused, stopped, etc.
/// </SUMMARY>
public string Status()
{
int i = 128;
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(i);
mciSendString("status MediaFile mode", stringBuilder, i, 0);
return stringBuilder.ToString();
}
/// <SUMMARY>
/// Get/Set Left Volume Factor
/// </SUMMARY>
public int LeftVolume
{
get
{
return 0; //Guess could be used to return Volume level: I don't need it
}
set
{
mciSendString(string.Concat
("setaudio MediaFile left volume to ", value), null, 0, 0);
}
}
/// <SUMMARY>
/// Get/Set Right Volume Factor
/// </SUMMARY>
public int RightVolume
{
get
{
return 0; //Guess could be used to return Volume level: I don't need it
}
set
{
mciSendString(string.Concat
("setaudio MediaFile right volume to ", value), null, 0, 0);
}
}
/// <SUMMARY>
/// Get/Set Main Volume Factor
/// </SUMMARY>
public int MasterVolume
{
get
{
return 0; //Guess could be used to return Volume level: I don't need it
}
set
{
mciSendString(string.Concat
("setaudio MediaFile volume to ", value), null, 0, 0);
}
}
/// <SUMMARY>
/// Get/Set Bass Volume Factor
/// </SUMMARY>
public int Bass
{
get
{
return 0;
}
set
{
mciSendString(string.Concat
("setaudio MediaFile bass to ", value), null, 0, 0);
}
}
/// <SUMMARY>
/// Get/Set Treble Volume Factor
/// </SUMMARY>
public int Treble
{
get
{
return 0;
}
set
{
mciSendString(string.Concat
("setaudio MediaFile treble to ", value), null, 0, 0);
}
}
}
}
现在读取 *.wpl* 文件以获取要播放的 MP3 [或任何其他格式]。
readPlaylist.cs
using System;
using System.Collections;
using System.Text;
using System.Xml;
namespace MP3player
{
class readPlaylist
{
private ArrayList name = new ArrayList();
private string m_xmlFile;
/// <SUMMARY>
/// The Windows Media Playlist Path xxx.wpl file
/// </SUMMARY>
public string playListPath
{
get
{
return m_xmlFile;
}
set
{
m_xmlFile = value;
Makeplaylist();
}
}
/// <SUMMARY>
/// Return an Arraylist of file found in Windows Media Playlist file
/// </SUMMARY>
public ArrayList PlayList
{
get
{
return name;
}
}
/// <SUMMARY>
/// Fills up an Arraylist with titles found in the
/// Windows Media Playlist file.
/// Using XmlTextReader
/// </SUMMARY>
private void Makeplaylist()
{
XmlTextReader readList = new XmlTextReader(m_xmlFile);
while (readList.Read())
{
if (readList.NodeType == XmlNodeType.Element)
{
if (readList.LocalName.Equals("media"))
{
name.Add(readList.GetAttribute(0).ToString());
}
}
}
}
}
}
现在让我们使用代码。
这是包含所有点击事件等的文件的一部分。
这是开始,请确保您已获得所有引用...
MediaPlayer.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace MP3player
{
public partial class MainPlayer : Form
{
ArrayList nowPlaylist = new ArrayList();
Player pl = new Player();
public MainPlayer()
{
InitializeComponent();
}
private void btnOpen_Click(object sender, EventArgs e)
{
lstBoxPlayList.Items.Clear();
openPlaylistDialog.ShowDialog();
readPlaylist readList = new readPlaylist();
readList.playListPath = openPlaylistDialog.FileName;
nowPlaylist = readList.PlayList;
for (int x = 0; x < nowPlaylist.Count; x++)
{
lstBoxPlayList.Items.Add(nowPlaylist[x]);
}
lstBoxPlayList.SetSelected(0, true);
}
上面的代码非常简单。 btnOpen_click
事件将打开一个 OpenFileDialog
窗口,获取选定的 *.wpl* 文件并将其发送到 readPlaylist
类,该类将依次解析它,返回一个包含所有文件名及其路径的 Arraylist
。 完成后,循环遍历它以显示其内容[在本例中为 listbox
]。 现在您已经准备好所有要播放的文件,所需要做的就是选择一个然后按播放。 或者双击它以启动它(我不会在这里展示这部分)。
播放 listbox
中选定的文件
private void btnPlay_Click(object sender, EventArgs e)
{
if (lstBoxPlayList.Items.Count > 0)
{
pl.Open(lstBoxPlayList.SelectedItem.ToString());
pl.Play(false);
}
}
这是一种在播放之前检查是否真的选择了文件的简单方法。
除此之外,非常简单。 当然,如果你从来没有做过,那就不是了。 这叫做学习过程。
如上所述,我认为代码中的注释非常好。 有了它和顶部的 MSDN 链接...你应该做得很好。
另外,我还尝试控制 Bass/Treble。 不知道它是否有效,因为我电脑上的扬声器系统不是很好,而且我的听力不好[因此我的扬声器系统很烂]。 但如果我正确阅读了 MSDN,它似乎与音量控制的工作方式相同。
我想就这些了,希望这个小例子能帮助到某人。
历史
- 2006 年 11 月 9 日:首次发布