1 首先添加 windows media player,音乐列表listbox,播放 停止 上一首 下一首 打开选择音乐文件 几个button 还有时间和歌词两个label 静音和放音两个picturebox等控件
在程序加载时
private void Form1_Load(object sender, EventArgs e)
{
//关闭播放器的自动播放
MusicPlayer.settings.autoStart = false;
//设置图片在图片盒子中的显示适应方式
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
//设置放音图片在图片盒子中显示
pictureBox1.Image = Image.FromFile(@"C:\Users\Administrator\Desktop\picture\放音.jpg");
}
在点击播放按钮中
//判断是否需要重新播放一个新的音乐文件
bool b = true;
//点击播放播放按钮
private void btnPlay_Click(object sender, EventArgs e)
{
if (btnPlay.Text == "播放")
{
if (b)
{
//获得当前选择的文件给URL 重新播放音乐
MusicPlayer.URL = list[listBox1.SelectedIndex];
}
//播放器开始播放
MusicPlayer.Ctlcontrols.play();
//按钮文本变成暂停
btnPlay.Text = "暂停";
}
else if (btnPlay.Text == "暂停")
{
//播放器暂停播放
MusicPlayer.Ctlcontrols.pause();
//按钮文本变成播放
btnPlay.Text = "播放";
b = false;
}
}
在点击停止按钮中
//点击停止按钮
private void btnStop_Click(object sender, EventArgs e)
{
//音乐播放器停止播放
MusicPlayer.Ctlcontrols.stop();
btnPlay.Text = "播放";
}
在点击打开按钮中
//创建存储文件路径的集合
List<string> list=new List<string>();
//打开音乐文件对话框
private void btnXZ_Click(object sender, EventArgs e)
{
//创建对话框对象
OpenFileDialog ofd = new OpenFileDialog();
//设置对话框标题
ofd.Title = "选择要添加的音乐文件";
//设置对话框初始目录
ofd.InitialDirectory = (@"C:\Users\Administrator\Desktop\歌词歌曲");
//设置文件类型
ofd.Filter = ("音乐文件|*.mp3|所有文件|*.*");
//设置文件可以多选
ofd.Multiselect = true;
//展示对话框
ofd.ShowDialog();
//拿到对话框中选择文件的全路径
string[] path = ofd.FileNames;
for (int i = 0; i < path.Length; i++)
{
//将选择的文件路径添加到集合中
list.Add(path[i]);
//将选择的文件名添加到下拉框中
listBox1.Items.Add(Path.GetFileNameWithoutExtension(path[i]));
}
}
在双击集合盒子中时
//双击音乐文件
private void listBox1_DoubleClick(object sender, EventArgs e)
{
//判断下拉框选项是否为0
if (listBox1.Items.Count == 0)
{
MessageBox.Show("请首先选择音乐文件");
return;//取消
}
try
{
//播放集合中下拉框选择的文件
MusicPlayer.URL = list[listBox1.SelectedIndex];
MusicPlayer.Ctlcontrols.play();
//按钮文本变暂停
btnPlay.Text = "暂停";
//写歌词
IsExistLrc(list[listBox1.SelectedIndex]);
}
catch { }
点击上一首按钮中
//点击播放上一首
private void button1_Click(object sender, EventArgs e)
{
//获得当前选择的项的索引
int index = listBox1.SelectedIndex;
//清空所以选择项的索引
listBox1.SelectedIndices.Clear();
//通过--来实现上一曲
index--;
//判断索引到d第一个时
if (index < 0)
{
//播放最后一首
index = listBox1.Items.Count - 1;
}
//将改变后的索引重新赋值给选择项的索引
listBox1.SelectedIndex = index;
//将当前播放路径赋值给URl
MusicPlayer.URL = list[index];
//播放
MusicPlayer.Ctlcontrols.play();
IsExistLrc(list[listBox1.SelectedIndex]);
}
在点击下一首按钮中
//点击播放下一首
private void button2_Click(object sender, EventArgs e)
{
//获得当前选择项的索引
int index = listBox1.SelectedIndex;
//清空之前所有选择性的索引
listBox1.SelectedIndices.Clear();
//通过++来实现下一首
index++;
//判断索引到最后一个时
if (index == listBox1.Items.Count)
{
//播放第一首
index = 0;
}
//将改变后的索引重新赋值给选择项的索引
listBox1.SelectedIndex = index;
//将当前播放路径赋值给URL
MusicPlayer.URL = list[index];
//播放
MusicPlayer.Ctlcontrols.play();
IsExistLrc(list[listBox1.SelectedIndex]);
}
右键listbox删除
//右键点击删除
private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
{
//首先从集合盒子中获得要删除歌曲的数量
int count = listBox1.SelectedIndices.Count;
//通过循环删除
for (int i = 0; i < count; i++)
{
//移除集合中集合盒子中选择
list.RemoveAt(listBox1.SelectedIndex);
//移除集合盒子中选择的
listBox1.Items.RemoveAt(listBox1.SelectedIndex);
}
}
点击静音或者放音图片时,首先在属性中将图片盒子中tag设为1
//点击静音或者播放
private void pictureBox1_Click(object sender, EventArgs e)
{
if (pictureBox1.Tag.ToString() == "1")
{
//静音
MusicPlayer.settings.mute = true;
//显示静音图片
pictureBox1.Image = Image.FromFile(@"C:\Users\Administrator\Desktop\picture\静音.jpg");
//将tap变成2
pictureBox1.Tag = "2";
}
else if (pictureBox1.Tag.ToString() == "2")
{
//不静音
MusicPlayer.settings.mute = false;
//显示放音图片
pictureBox1.Image = Image.FromFile(@"C:\Users\Administrator\Desktop\picture\放音.jpg");
//将tag变成1
pictureBox1.Tag = "1";
}
}
自动播放下一首
private void timer1_Tick(object sender, EventArgs e)
{
//如果播放器状态等于正在播放状态
if (MusicPlayer.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
//将时间显示在label中
label2.Text = MusicPlayer.currentMedia.duration.ToString() + "\r\n" + MusicPlayer.currentMedia.durationString + "\r\n" + MusicPlayer.Ctlcontrols.currentPositionString + "\r\n" + MusicPlayer.Ctlcontrols.currentPosition.ToString();
//获得播放器两个Tosting的时间
double time1 = double.Parse(MusicPlayer.currentMedia.duration.ToString());
double time2 = double.Parse(MusicPlayer.Ctlcontrols.currentPosition.ToString()) + 1;
//判断这两个时间的大小
if (time1 <= time2)
{
//获得当前选择项的索引
int index = listBox1.SelectedIndex;
//清空之前所有选择性的索引
listBox1.SelectedIndices.Clear();
//通过++来实现下一首
index++;
//判断索引到最后一个时
if (index == listBox1.Items.Count)
{
index = 0;
}
//将改变后的索引重新赋值给选择项的索引
listBox1.SelectedIndex = index;
//将当前播放路径赋值给URL
MusicPlayer.URL = list[index];
//播放
IsExistLrc(list[listBox1.SelectedIndex]);
MusicPlayer.Ctlcontrols.play();
}
}
}
//播放器状态发送改变时,输出当前播放器的状态
private void MusicPlayer_PlayStateChange(object sender,
AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
//如果当前播放器的状态是end
if (MusicPlayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
{
//就获得当前选择项的索引
int index = listBox1.SelectedIndex;
//清空以前所有选择项的索引
listBox1.SelectedIndices.Clear();
index++;
if (index == listBox1.Items.Count)
{
index = 0;
}
//将改变后的索引重新赋值给当前选择项
listBox1.SelectedIndex = index;
//将该音乐文件赋值给播放器的URI
MusicPlayer.URL = list[index];
}
if (MusicPlayer.playState == WMPLib.WMPPlayState.wmppsReady)
{
try
{
//播放器播放
MusicPlayer.Ctlcontrols.play();
}
catch { }
}
}
写歌词方法,注意自动播放时,上一首,下一首时,都要调用
//写个方法做歌词
void IsExistLrc(string path)
{
path=path.Replace("mp3", "lrc");
//判断路径是否存在
if (File.Exists(path))
{
//读取歌词行文件
string[] listText = File.ReadAllLines(path, Encoding.UTF8);
//格式化歌词
IsLrc(listText);
}
else
{
label3.Text = "当前歌曲不存在歌词";
}
}
//创建一个集合存储时间
List<double> listTime = new List<double>();
//创建一个集合存储歌词
List<string> listlrcText = new List<string>();
//格式化歌词
void IsLrc(string[] listText)
{
for (int i = 0; i < listText.Length; i++)
{
//[00:15.57]当我和世界不一样 把,截掉
string[] lrcTemp = listText[i].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);
//00:15.57 lrcTemp[0]
//当我和世界不一样 lrcTemp[1] 把:截掉
string[] lrcNewTemp = lrcTemp[0].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
double time = (double.Parse(lrcNewTemp[0]) * 60 + double.Parse(lrcNewTemp[1]));
//把截取出来的时间添加到集合中
listTime.Add(time);
//把截取的歌词添加到集合中
listlrcText.Add(lrcTemp[1]);
}
}
//播放歌词
private void timer2_Tick(object sender, EventArgs e)
{
//遍历时间集合
for (int i = 0; i < listTime.Count; i++)
{
try
{
//如果当前播放器时间的状态大于等于当前歌词时间并且小于下一句歌词的时间
if (MusicPlayer.Ctlcontrols.currentPosition >= listTime[i] && MusicPlayer.Ctlcontrols.currentPosition < listTime[i + 1])
{
//就将当前歌词赋值给文本
label3.Text = listlrcText[i];
}
}
catch { }
}
}