1.作业要求
1. 程序应能够读取MP3和ogg文件,并播放其中的音频。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行
2.设计思路
选择Windows Forms
作为开发平台,使用工具箱中的控件来构造用户界面,使用OpenFileDialog
允许用户选择音频文件,并进行播放。 播放控制例如开始、暂停。
3.窗体设计
控件功能
Label:展示当前播放的歌曲。
ListBox:展示选择的歌曲列表。
AxWindowsMediaPlayer:用于播放音乐。
OpenFileDialog:选择音乐
Button:选择歌曲文件、停止播放、下一曲的功能实现。
TrackBarl:音量控制
4.代码展示
4.1类成员的定义
List<string> localmusiclist = new List<string> { };
OpenFileDialog openFileDialog = new OpenFileDialog();
using (var waveOut = new WaveOutEvent())
localmusiclist用来存储歌曲,openfiledialog用来播放mp3音频,waveout用来播放ogg文件。
4.2mp3音乐播放
4.2.1代码结构
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*.mp3;";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)//清控件
{
listBox1.Items.Clear();
if (files != null)
{
Array.Clear(files, 0, files.Length);//清文件
}
files = openFileDialog1.FileNames;
string[] array = files;
foreach (string x in array)
{
listBox1.Items.Add(x);
localmusiclist.Add(x);
}
}
}
4.2.2具体实施
4.3音乐停止
调用了axWindowsMediaPlayer1
控件的Ctlcontrols.stop()
方法来停止当前正在播放的媒体。这是使用ActiveX Windows Media Player控件来停止媒体播放的标准方法。
private void button2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
4.4下一首音乐
用索引来得到下一首音乐URL,再进行播放,更改Label
的信息显示与SelectedIndex
的当前索引。且在索引大于当前音乐列表的时候,将Index
重置为零,从而实现循环播放功能。
private void button3_Click(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
int index = listBox1.SelectedIndex + 1;
if (index >= localmusiclist.Count())
{
index = 0;
}
axWindowsMediaPlayer1.URL = localmusiclist[index];
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);
listBox1.SelectedIndex = index;
}
4.5音量大小控制
TrackBar
个设置了axWindowsMediaPlayer
的音量。axWindowsMediaPlayer1.settings.volume
属性用于获取或设置媒体播放器的音量。
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
4.6ogg文件的播放
4.6.1代码结构
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "打开音频|*.ogg";
string oggFilePath = "";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
oggFilePath= openFileDialog.FileName;
}
using (var vorbisReader = new VorbisWaveReader(oggFilePath))
{
// 创建一个WaveOutEvent实例来播放音频
using (var waveOut = new WaveOutEvent())
{
// 初始化WaveOutEvent实例,并设置其输入为VorbisFileReader
waveOut.Init(vorbisReader);
// 开始播放音频
waveOut.Play();
// 等待播放完成,或者可以添加其他逻辑,比如响应播放事件
while (waveOut.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(100); // 等待一段时间,避免死循环
}
// 播放完成后,停止并释放WaveOutEvent资源
waveOut.Stop();
waveOut.Dispose();
}
// 释放VorbisFileReader资源
vorbisReader.Dispose();
}
}
4.6.2实施结果
5.完整代码
using System.Diagnostics.Eventing.Reader;
using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;
namespace WinFormsApp3
{
public partial class Form1 : Form
{
string[] files;
List<string> localmusiclist = new List<string> { };
public Form1()
{
InitializeComponent();
}
private void musicplay(string filename)
{
axWindowsMediaPlayer1.URL = filename;
string extension = Path.GetExtension(filename);
if (extension == ".ogg") { Console.WriteLine("这是ogg文件。"); }
else
{
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*.mp3;";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)//清控件
{
listBox1.Items.Clear();
if (files != null)
{
Array.Clear(files, 0, files.Length);//清文件
}
files = openFileDialog1.FileNames;
string[] array = files;
foreach (string x in array)
{
listBox1.Items.Add(x);
localmusiclist.Add(x);
}
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);
}
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}
private void button2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
int index = listBox1.SelectedIndex + 1;
if (index >= localmusiclist.Count())
{
index = 0;
}
axWindowsMediaPlayer1.URL = localmusiclist[index];
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);
listBox1.SelectedIndex = index;
}
}
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "打开音频|*.ogg";
string oggFilePath = "";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
oggFilePath= openFileDialog.FileName;
}
using (var vorbisReader = new VorbisWaveReader(oggFilePath))
{
// 创建一个WaveOutEvent实例来播放音频
using (var waveOut = new WaveOutEvent())
{
// 初始化WaveOutEvent实例,并设置其输入为VorbisFileReader
waveOut.Init(vorbisReader);
// 开始播放音频
waveOut.Play();
// 等待播放完成,或者可以添加其他逻辑,比如响应播放事件
while (waveOut.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(100); // 等待一段时间,避免死循环
}
// 播放完成后,停止并释放WaveOutEvent资源
waveOut.Stop();
waveOut.Dispose();
}
// 释放VorbisFileReader资源
vorbisReader.Dispose();
}
}
}
}
6.作业总结
通过本次作业对c#中窗体控件掌握的更加深刻了,加强了拖过第三方库来调用控件之间的联系的能力。对c#学习更上一层楼。
7.改进思路
包含音乐格式播放的文件格式较少,只有mp3和ogg文件,更先进的例如mp4等无法播放。需进一步对此进行补充。