打开控件
新建一个WinForm应用程序
在工具箱中找到“菜单和工具栏”
-> 右键
-> 选择项
-> COM组件
-> WindowsMediaPlayer
-> 添加到工具箱
拖入,重命名
基本属性
-
控制播放歌曲:将歌曲的全路径名放到URL中
<axWindowsMediaPlayer>.URL
//比如这个时候播放器中有一首歌曲
MusicPlayer.URL = @"E:\C#项目\4Day\张晏铭 - 佳佳.mp3";
-
控制是否自动播放
<axWindowsMediaPlayer>.settings.autoStart
//在窗体加载的时候我们就禁止播放器自动播放歌曲
MusicPlayer.settings.autoStart = false;
-
控制播放、暂停和停止
<axWindowsMediaPlayer>.Ctlcontrol.player(); <axWindowsMediaPlayer>.Ctlcontrol.pause(); <axWindowsMediaPlayer>.Ctlcontrol.stop();
private void btnPlay_Click(object sender, EventArgs e)
{
//播放音乐
MusicPlayer.Ctlcontrols.play();
}
private void btnPause_Click_1(object sender, EventArgs e)
{
//音乐暂停
MusicPlayer.Ctlcontrols.pause();
}
private void btnStop_Click_1(object sender, EventArgs e)
{
//音乐停止
MusicPlayer.Ctlcontrols.stop();
}
- 控制单击切换play和pause
/// <summary>
/// 播放和暂停合并成一个按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPlayAndPause_Click(object sender, EventArgs e)
{
if (btnPlayAndPause.Text == "播放")
{
MusicPlayer.Ctlcontrols.play();
btnPlayAndPause.Text = "暂停";
}
else if (btnPlayAndPause.Text == "暂停")
{
MusicPlayer.Ctlcontrols.pause();
btnPlayAndPause.Text = "播放";
}
}
- settings.mute属性 静音
/// <summary>
/// 静音
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void labMu_Click(object sender, EventArgs e)
{
if (labMu.Tag.ToString() == "1.jpg")
{
MusicPlayer.settings.mute = true;//静音
labMu.Image = Image.FromFile(@"E:\C#项目\4Day\2.jpg");
labMu.Tag = "2";
}
else if (labMu.Tag.ToString() == "2.jpg")
{
MusicPlayer.settings.mute = false;
labMu.Image = Image.FromFile(@"E:\C#项目\4Day\1.jpg");
labMu.Tag = "1";
}
}
- settings.volume属性 控制音量
/// <summary>
/// 增加音量
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnVOL2_Click(object sender, EventArgs e)
{
MusicPlayer.settings.volume -= 5;
}
/// <summary>
/// 减小音量
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnVOL1_Click(object sender, EventArgs e)
{
//每次音量增加5
MusicPlayer.settings.volume += 5;
}
/// <summary>
/// 下一曲
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnNext_Click(object sender, EventArgs e)
{
//获取当前选中的索引
int index = listMusicName.SelectedIndex;
index++;//让索引加1
//判断如果索引超出歌曲列表的总数就重新赋值为0
if (index == listMusicName.Items.Count)
{
index = 0;
}
//listMusicName.SelectedItem=listMusicName.Items[index];
//改变选中的歌曲
listMusicName.SelectedIndex = index;
//把选中的后歌曲的路径给URL
MusicPlayer.URL = listMusicFile[index];
//播放歌曲
MusicPlayer.Ctlcontrols.play();
}
/// <summary>
/// 上一曲
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUp_Click(object sender, EventArgs e)
{
//获取当前选中的索引
int index = listMusicName.SelectedIndex;
index--;//让索引加1
//判断如果索引超出歌曲列表的总数就重新赋值为0
if (index < 0)
{
index = listMusicName.Items.Count - 1;
}
//listMusicName.SelectedItem=listMusicName.Items[index];
//改变选中的歌曲
listMusicName.SelectedIndex = index;
//把选中的后歌曲的路径给URL
MusicPlayer.URL = listMusicFile[index];
//播放歌曲
MusicPlayer.Ctlcontrols.play();
}
音乐文件OpenFileDialog
OpenFileDialog ofd = new OpenFileDialog();
ShowDialog()方法
DialogResult枚举(OK和Cancel)
InitialDiectory属性
System.Environment.GetFolderPath()方法
System.Environment.SpecialFolder枚举
Filter属性
FileName属性、FileNames属性
Multiselect属性
Title属性
存放歌曲列表List<>
List<string> l = new List<string>();
List<string>与string[]
List为标准,播放与选择,与List同步
ListBox显示歌名
ListBox同步显示
count属性、add方法、addrange方法、chear方法
ListBox显示歌曲列表
显示歌曲名,非路径名
SelectedIndex属性,如果没选择,返回-1
SelectedItem属性,返回指定字符串
/// <summary>
/// 添加音乐
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click(object sender, EventArgs e)
{
//点击这个按钮弹出一个对话框,我们可以浏览这个框里面的内容
//然后把选中的歌曲全部添加到一个表中
OpenFileDialog ofd = new OpenFileDialog();//通过这个类我们打开文件
ofd.Multiselect = true;//可以多选
ofd.Title = "请选择音乐文件";//设置选择什么样的文件
//设置初始的目录
ofd.InitialDirectory = @"E:\C#项目\4Day";
ofd.Filter = "(*.mp3)|*.mp3";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
//获取选中的所有的歌曲的路径
string[] fileNames = ofd.FileNames;
for (int i = 0; i < fileNames.Length; i++)
{
//把路径中的歌曲名截取出来
string musicName = fileNames[i].Substring(fileNames[i].LastIndexOf('\\') + 1);
//把选中的歌曲名字添加到listbox这个控件中
listMusicName.Items.Add(musicName);
//把歌曲的路径存到这个集合中去
listMusicFile.Add(fileNames[i]);
//默认有一首歌是选中的
listMusicName.SelectedIndex = 0;
MusicPlayer.URL = listMusicFile[0];
//播放列表中有歌曲了,把播放按钮和停止按钮启用
btnPlayAndPause.Enabled = true;
btnStop.Enabled = true;
}
}
}
为ListBox添加双击事件
//双击这首歌曲播放
private void listMusicName_MouseDoubleClick(object sender, MouseEventArgs e)
{
//获取当前选中的歌曲的索引
int index = listMusicName.SelectedIndex;
//路径全都在泛型集合中
//通过索引获取这首歌曲对应的路径,并且把路径给播放器的URL
MusicPlayer.URL = listMusicFile[index];
//播放这首歌曲
MusicPlayer.Ctlcontrols.play();
//把播放按钮的内容修改一下
btnPlayAndPause.Text = "暂停";
}
媒体状态
WMPLib.WMPPlayerState枚举
PlayState属性
Status属性
PlaySateChange事件
/// <summary>
/// 自动播放下一曲
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MusicPlayer_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if (MusicPlayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
{
int index = listMusicName.SelectedIndex;
if (index == listMusicName.Items.Count - 1)
{
index = 0;
}
else
{
index++;
}
MusicPlayer.URL = listMusicFile[index];
listMusicName.SelectedIndex = index;
}
if (MusicPlayer.playState == WMPLib.WMPPlayState.wmppsReady)
{
//播放歌曲
try
{
MusicPlayer.Ctlcontrols.play();
btnPlayAndPause.Text = "暂停";
}
catch
{
}
}
}
timer控件
实现功能
显示歌曲名、播放时间、播放状态
同步进度条
歌名滚动显示
/// <summary>
/// 显示音乐正在播放的时间和歌曲名称
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
//显示音乐正在播放的时间
if (MusicPlayer.currentMedia != null)
{
//显示音乐播放的时间
labTime.Text = MusicPlayer.Ctlcontrols.currentPositionString;
//显示歌曲名称
labMusicName.Text = MusicPlayer.currentMedia.name;
}
#region 状态显示
if (MusicPlayer.currentMedia != null)//判断不为空
{
//基本属性
label2.Text = string.Format("{0}\r\n{1}\r\n{2}\r\n{3}\r\n{4}\r\n{5}\r\n声音:{6}\r\n{7}",
MusicPlayer.currentMedia.duration,//(总秒数)
MusicPlayer.currentMedia.durationString,//(总时间)
MusicPlayer.currentMedia.name,//(歌曲名字)
MusicPlayer.currentMedia.sourceURL,//(歌曲的地址)
MusicPlayer.Ctlcontrols.currentPosition,
MusicPlayer.Ctlcontrols.currentPositionString,//(音乐的开始播放时间0)
MusicPlayer.settings.mute,//(音乐的静音)
MusicPlayer.settings.volume//(声音的大小)
);
}
#endregion
}
歌词的显示
得到歌曲名相同的歌词
System.IO.File.Exsits()方法
System.IO.File.ReadAllLines()方法
处理歌词格式化
歌词排序
显示算法
String.Compare()方法
using System.IO;
//用来存歌词的路径
List<string> listLrc = new List<string>();
//用来存歌词
List<string> listSongLrc = new List<string>();
/// <summary>
/// 添加音乐
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click(object sender, EventArgs e)
{
//找这首歌曲的歌词
string strLrc = fileNames[i].Substring(0, fileNames[i].LastIndexOf('.')) + ".lrc";
//判断这个路径下是否有这个歌词文件
if (File.Exists(strLrc))
{
//有这个歌词就把歌词路径添加到集合中
listLrc.Add(strLrc);
//把读出来的歌词直接存到集合中
listSongLrc.AddRange(File.ReadAllLines(strLrc, Encoding.UTF8));
}
else
{
//否则提示没有找到歌词
labSong.Text = "未找到歌词";
}
}
/// <summary>
/// 格式化歌词
/// </summary>
/// <returns></returns>
private List<string> FormatLrc()
{
//定义一个集合用来存处理好的歌词
List<string> list = new List<string>();
//遍历存未切割好的歌词
for (int i = 0; i < listSongLrc.Count; i++)
{
//把每一句歌词都要切割
string[] lrc = listSongLrc[i].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);
//判断切割好的内容的长度是否大于1
if (lrc.Length > 1)
{
//如果大于1证明有时间也有歌词
for (int j = 0; j < lrc.Length - 1; j++)
{
//把歌词和时间全部存到这个集合中去
list.Add(lrc[j] + "|" + lrc[lrc.Length - 1]);
}
}
}
//把歌词排序
for (int i = 0; i < list.Count - 1; i++)
{
for (int j = 0; j < list.Count - 1 - i; j++)
{
if (string.Compare(list[j], list[j + 1]) > 0)
{
string temp = list[j];
list[j] = list[j + 1];
list[j + 1] = temp;
}
}
}
//File.WriteAllLines(@"E:\C#项目\4Day\1.txt", list);
return list;
}
/// <summary>
/// 显示音乐正在播放的时间和歌曲名称
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
//显示歌词
//上一句歌词播放的时间 当前音乐 播放的时间 下一句歌词播放的时间
if (listSongLrc.Count > 0 && MusicPlayer.currentMedia != null)
{
//获得当前歌曲播放的时间
string time = MusicPlayer.Ctlcontrols.currentPositionString;
//遍历歌词
for (int i = 0; i < listSongLrc.Count - 1; i++)
{
if (string.Compare(listSongLrc[i], time) < 0 && string.Compare(time, listSongLrc[i + 1]) < 0)
{
labSong.Text = listSongLrc[i].Split('|')[1];
}
}
}