一.功能说明
请编写一个C#程序,实现音乐文件的播放功能,要求如下:
1) 程序应能够读取MP3
文件,并播放其中的音频
2) 应能够播放ogg
文件
3)程序应具有良好的用户界面,方便用户进行操作
4)程序应具有良好的兼容性,能在不同版本的C#中正常运行。
二. 窗体设计:
如图所示:
其中,各控件实现功能如下:
Label:展示当前播放的歌曲。
ListBox:展示选择的歌曲列表。
AxWindowsMediaPlayer:用于播放常规格式音乐(ogg无法用此播放)。
OpenFileDialog:用于选择音乐文件。
Button:用于选择歌曲文件、停止播放、下一曲的功能实现。
TrackBarl:用于音量控制。
三.代码实现
文件选择功能:
private void button1_Click(object sender, EventArgs e)
{
string[] files = { };
openFileDialog1.Filter = "Select Audio|*.mp3;*.flac;*.wav;*.ogg";
// Open multiple files simultaneously
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
// Clear the existing list
listBox1.Items.Clear();
localMusicList.Clear();
if (files != null)
{
Array.Clear(files, 0, files.Length);
}
files = openFileDialog1.FileNames;
string[] fileList = files;
foreach (string file in fileList)
{
listBox1.Items.Add(file);
localMusicList.Add(file);
}
}
}
button1_Click
事件处理程序在用户点击按钮时触发。它的功能是允许用户选择多个音频文件,将它们显示在列表框中,并将它们的路径存储起来,以便后续处理。
列表框选项改变事件处理:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (localMusicList.Count > 0)
{
axWindowsMediaPlayer1.URL = localMusicList[listBox1.SelectedIndex];
PlayMusic(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localMusicList[listBox1.SelectedIndex]);
}
}
- 检查
localMusicList
中是否有音乐文件。 - 如果列表框中有选定的项目:
- 将选定项目的路径赋给
axWindowsMediaPlayer1.URL
,以便播放。 - 调用
PlayMusic
方法播放选定的音乐。 - 将选定的音乐文件名(不含扩展名)显示在
label1.Text
中
- 将选定项目的路径赋给
音乐选择功能:
private void PlayMusic(string filename)
{
string extension = Path.GetExtension(filename).ToLower();
if (extension == ".ogg")
{
if (currentVorbisReader != null)
{
// Ensure to stop current playback before disposing resources
if (waveOut.PlaybackState != PlaybackState.Stopped)
{
waveOut.Stop();
}
currentVorbisReader.Dispose();
}
currentVorbisReader = new VorbisWaveReader(filename);
waveOut.Init(currentVorbisReader);
waveOut.Play();
}
else
{
axWindowsMediaPlayer1.URL = filename;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
这段代码定义了一个名为 PlayMusic
的方法,用于根据文件的扩展名来播放音乐文件。
- 如果文件扩展名为 ".ogg",则创建一个新的 VorbisWaveReader 对象来读取指定的 OGG 文件,并使用 WaveOutEvent 对象来播放该文件。
- 如果文件扩展名不是 ".ogg",则将文件路径赋值给 Windows Media Player 控件的 URL 属性,并开始播放该文件。
暂停播放:
private void button2_Click(object sender, EventArgs e)
{
if (waveOut.PlaybackState == PlaybackState.Playing)
{
waveOut.Pause(); // Pause playing OGG
}
axWindowsMediaPlayer1.Ctlcontrols.stop(); // Stop playing other formats
}
这段代码定义了一个名为 button2_Click
的方法,它在用户点击按钮(假设命名为 "button2")时触发。
- 如果正在播放 OGG 格式音频,则暂停播放。
- 无论是否正在播放 OGG 格式音频,都停止播放其他格式的音频。
循环播放下一首音乐:
它在用户点击按钮(假设命名为 "button3")时触发。
- 如果有音乐文件:
- 计算下一个要播放的音乐文件的索引,如果当前索引加1后超出了列表的范围,则将索引重置为0,实现循环播放。
- 将下一个音乐文件的路径赋值给 Windows Media Player 控件的 URL 属性,并开始播放该文件。
- 调用
PlayMusic
方法播放下一个音乐文件。 - 更新
label1
控件显示下一个音乐文件的文件名(不含扩展名)。 - 将列表框
listBox1
中的选中项设置为下一个音乐文件的索引,以便在列表框中高亮显示。
音量控制:
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
- 当用户滚动滑动条时,它将滑动条的值赋给 Windows Media Player 控件的音量属性,以实现音量的调节。
四.完整代码:
五.总结:
通过本次作业,我通过导入第三方库,加深了对C#控件的使用和控件之间联系的理解。尽管当前程序可以播放多种音乐文件格式,但它并不能解析最新的音乐文件格式,比如ape和aac。此外,还缺少一些高级音频功能,比如音频效果处理(如均衡器、声音增强等)以及支持音频流的直接下载和播放。虽然还有改进的空间,但这个作业让我更深入地了解了音乐播放器的设计和开发,为我未来的学习和实践奠定了基础。