目录
在这篇文章中,我将分享一个基于Windows Forms和Windows Media Player控件的音乐播放器应用的开发过程。这个应用旨在提供一个简单的用户界面,允许用户选择本地音乐文件并播放它们。下面是我创建这个应用的主要步骤和代码实现。
一、项目设置
首先,我创建了一个新的Windows Forms项目,并在其中添加了一个Form(我将其命名为Form1)。然后,我通过工具箱添加了必要的控件,包括ListBox(用于显示音乐列表)、Button(用于打开文件对话框)、TrackBar(用于控制音量)和Label(用于显示当前播放音乐的名称)。
二、变量声明
在Form1的类中,我声明了两个变量:一个字符串数组files
用于存储用户选择的文件路径,和一个List<string>
类型的localmusiclist
用于在程序中跟踪这些文件。
namespace 音乐播放器
{
public partial class Form1 : Form
{
string[] files;
List<string> localmusiclist = new List<string> { };
public Form1()
{
InitializeComponent();
}
...//其他代码行
}
}
三、音乐播放功能
我创建了一个名为musicplay
的私有方法,用于处理音乐文件的播放。根据文件的扩展名,这个方法可以判断是否为.ogg
格式(这需要特殊的播放方法),否则它将使用Windows Media Player控件播放音乐。
private void musicplay(string filename)
{
string extension = Path.GetExtension(filename);
if (extension == ".ogg") { Console.WriteLine("this is ogg file."); }//ogg需要特别的播放方法
else
{
Console.WriteLine("this is not ogg file.");
axWindowsMediaPlayer1.Ctlcontrols.play();//控制按钮的实现
}
}
注意:由于这个示例中没有实际处理.ogg
文件的播放,所以这里只是简单地打印了一条消息。
如果需要实现ogg文件格式的播放,则在此新增一个方法用于播放ogg文件。首先,确保你已经安装了NAudio库。你可以通过NuGet包管理器来安装它。以下是方法的创建:
private async Task PlayOggFileAsync(string oggFilePath)
{
if (File.Exists(oggFilePath))
{
using (var vorbisReader = new VorbisWaveReader(oggFilePath))
using (var outputDevice = new WaveOutEvent())
{
outputDevice.Init(vorbisReader);
outputDevice.Play();
// 等待播放完成,使用异步等待而不是轮询
await Task.Run(() =>
{
while (outputDevice.PlaybackState == PlaybackState.Playing)
{
Thread.Sleep(100); // 减少轮询频率
}
});
// 清理资源
outputDevice.Stop();
outputDevice.Dispose();
}
}
else
{
Console.WriteLine("文件不存在");//处理文件不存在的情况
}
}
四、文件选择功能
当用户点击“添加音乐”按钮时,我使用OpenFileDialog
控件允许用户选择多个音乐文件。选择后,我将这些文件的路径添加到ListBox
和localmusiclist
中。
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*mp3;*.wav;*.flac";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Clear();//清空,便于把新的文件导入
if (files != null)
{
Array.Clear(files, 0, files.Length);//用array做泛类的约束
}
files = openFileDialog1.FileNames;//需要一个数组变量
string[] array = files;
//添加新选择的文件到ListBox和localmusiclist
foreach (string x in array)
{
listBox1.Items.Add(x);
localmusiclist.Add(x);
}
}
}
五、播放列表和音量控制功能
当用户从ListBox
中选择一个音乐文件时,我使用SelectedIndexChanged
事件来更新Windows Media Player控件的URL并调用musicplay
方法。同时,我还更新了Label
以显示当前播放音乐的名称。
音量控制是通过TrackBar
控件实现的。当用户滚动滑块时,我使用Scroll
事件来更新Windows Media Player控件的音量设置。
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)//保证有音乐文件被选中
{
axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];
musicplay(axWindowsMediaPlayer1.URL);
//更新Windows Media Player控件的URL并播放音乐
//更新Label以显示当前播放音乐的名称
label1.Text =
Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);
}
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
label2.Text = trackBar1.Value + "%";
}
六、停止播放功能
首先,我们为“停止”按钮(假设其名为button2
)添加了一个点击事件处理器。当用户点击该按钮时,将调用Windows Media Player控件的stop
方法来停止当前正在播放的音乐。
private void button2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
七、播放下一首功能
接下来,我们为“下一曲”按钮(假设其名为button3
)添加了一个点击事件处理器。当用户点击该按钮时,应用将停止当前播放的音乐(如果需要的话),并播放列表中的下一首歌曲。如果当前是列表中的最后一首歌曲,则循环到第一首。
private void button3_Click(object sender, EventArgs e)
{
int nextIndex = listBox1.SelectedIndex + 1;//获取下一曲的索引
if (nextIndex >= localmusiclist.Count)
{
nextIndex = 0;//如果是最后一首,则回到第一首
}
//更新播放器和UI
axWindowsMediaPlayer1.URL = localmusiclist[nextIndex];//需要的返回类型为int
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[nextIndex]);
listBox1.SelectedIndex = nextIndex;
}
八、播放ogg格式文件
由于Windows Media Player控件不支持Ogg格式的文件,我们需要使用额外的库来播放这些文件。在以下代码行中,button4_Click
事件处理器展示了如何使用VorbisWaveReader
(来自NAudio库)和WaveOutEvent
来播放Ogg文件。
private async void button4_Click(object sender, EventArgs e)
{
string oggFilePath = ""; // 替换为你的Ogg文件路径
OpenFileDialog openfiledialog = new OpenFileDialog();
openFileDialog1.Filter = "播放音频|*.ogg";
if (openfiledialog.ShowDialog() == DialogResult.OK)
{
oggFilePath = openfiledialog.FileName;
}
if (!string.IsNullOrEmpty(oggFilePath))
{
await PlayOggFileAsync(oggFilePath); // 使用异步调用播放Ogg文件
}
using (var vorbisReader = new VorbisWaveReader(oggFilePath))
{
using (var outputDevice = new WaveOutEvent())
{
outputDevice.Init(vorbisReader);
outputDevice.Play();
// 等待播放完成或用户输入
while (outputDevice.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(1000);
}
}
}
}
请注意,我使用了Task.Run
来在后台线程中执行轮询,这样UI线程就不会被阻塞。然而,更好的做法是使用NAudio提供的事件机制来异步地检测播放何时完成。但是,由于NAudio的WaveOutEvent
类没有直接提供这样的事件,我们可能需要自己实现或使用其他库。
另外,由于PlayOggFileAsync
是一个异步方法,我们在调用它时使用了await
关键字,这意味着调用它的方法(在这个例子中是button4_Click
)也需要是异步的,并且返回Task
或void
(对于事件处理程序)。
九、界面展示
十、总结
音乐播放器功能通过结合内置的axWindowsMediaPlayer1
控件和NAudio库,成功实现了对多种音频格式的支持,特别是扩展了对Ogg Vorbis格式的播放能力。播放器利用异步处理技术,保证了在播放音频时用户界面的流畅性,并通过using
语句有效管理了非托管资源。
此外,播放器提供了文件选择对话框,方便用户选择并播放音频文件,增强了用户体验。同时,通过分离不同音频格式的播放逻辑,提高了代码的可维护性和扩展性,使得未来支持更多音频格式变得更加容易。
然而,音乐播放器功能仍然有进一步完善的空间,比如增加播放控制按钮、音量调节功能、播放列表管理等,以提供更加全面和丰富的用户体验。此外,对于多线程环境中的资源处理也需要格外注意,确保线程安全和避免潜在的问题。总之,上述音乐播放器功能为实现一个完整、多功能的音乐播放器打下了坚实的基础。