以MediaPlayer为播放器核心,自己动手写一个简易版的音乐播放器
首先需要添加MediaPlayer,步骤如下:
新建一个WinForm应用程序
在工具箱中找到“菜单和工具栏”
->右键
->选择项
->COM组件
->WindowsMediaPlayer
->添加到工具箱
添加到工具箱之后我们就要先将MediaPlayer拖入窗口中,然后看一下都有些什么属性
控制播放歌曲:<axWindowsMediaPlayer>.URL将歌曲的全路径名放到URL中
控制是否自动播放:<axWindowsMediaPlayer>.setting.autoStart
控制播放、暂停和停止
<axWindowsMediaPlayer>.Ctlcontrol.player();播放
<axWindowsMediaPlayer>Ctlcontrol.pause();暂停
<axWindowsMediaPlayer>Ctlcontrol.stop();停止
WindowsMediaPlayer.Ctlcontrols.currentPositionString音乐播放当前时间的00:00显示形式
WindowsMediaPlayer.Ctlcontrols.currentPosition音乐播放当前时间的详细时间,单位为秒。详细的double类型
WindowsMediaPlayer.currentMedia.durationString播放的音乐的总时间00:00形式
WindowsMediaPlayer.currentMedia.duration播放的音乐的总时间,以秒的形式表现,double类型
然后就可以开始编码了
首先,我们需了解播放器的原理我们写的过程中需要一步一步调试,所以需要关闭自动播放的功能
在Form的Load事件中添加代码:
axPlayer.settings.autoStart = false;
在界面上添加播放、静音、停止按钮对它们添加Click事件。事件中关键代码为:
axPlayer.Ctlcontrols.play();//播放
axPlayer.Ctlcontrols.pause();//暂停
axPlayer.settings.mute = true;//静音
axPlayer.Ctlcontrols.stop();//停止
然后添加一个打开按钮
在类内方法外定义一个集合,存储音乐文件列表
List<string> lsongs = new List<string>();
然后添加按钮的Click事件:
OpenFileDialog ofd = new OpenFileDialog();生成一个OpenFileDialog对象,然后对其属性进行设置,关键的地方就是要实现集合lsongs中的数据要和listsongplayer中的数据保持一致
for (int i = 0; i <ofd.FileNames.Length; i++)
{
lsongs.Add(ofd.FileNames[i]);
string[] temp = ofd.FileNames[i].Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
listsongplayer.Items.Add(temp[temp.Length - 1]);
}
之后调用歌曲的播放方法,实现歌曲的播放
实现上一曲和下一曲功能
这两个功能其实是一样的,只是方法中比较的数字不同罢了
下一曲;if (listsongplayer.Items.Count>0)
{
MyPlay(index > (lsongs.Count- 1) ? 0 : index);
}
上一曲:if (listsongplayer.Items.Count>0)
{
MyPlay(listsongplayer.SelectedIndex - 1 < 0 ? lsongs.Count - 1 :--listsongplayer.SelectedIndex);
}
双击列表中的歌曲名称播放
添加ListBox的MouseDoubleClick事件
MyPlay(listsongplayer.SelectedIndex);
删除选中项
这个需要实现lsongs集合和listBox中的数据同步,删除的时候都要删除
if (listsongplayer.SelectedIndex!=-1)
{
lsongs.RemoveAt(listsongplayer.SelectedIndex);
listsongplayer.Items.RemoveAt(listsongplayer.SelectedIndex);
}
清空列表的时候也是需要两个地方都清空
if (listsongplayer.SelectedIndex!=-1)
{
lsongs.Clear();
listsongplayer.Items.Clear();
}
音量的控制
axPlayer.settings.volume,通过这个属性,就可以控制音量的大小,然后实现音量+和音量-按钮的Click事件
能熟练的掌握整体音乐播放器的播放,自动播放下一曲完成上一曲和下一曲的操作等等都需要多MediaPlayer播放歌曲的过程有很深的了解
这张图上面的两张小图充分表明了MediaPlayer在播放一首歌的时候的执行过程,同时我们看到了,当我们需要自动切换的时候,也只能等到MediaEnded状态之后
总体来说,这一个题目的难点就在于对歌词的处理上
完成对歌词的处理,需要的定义连个方法,第一个方法InLrc(),这个方法导入歌词,然后又ForMatLrc()方法来完成对歌词的格式化
private void InLrc(string pathSong)
{
pathSong = pathSong + ".lrc";//歌词文件就是音乐文件名+”.lrc”
if (System.IO.File.Exists(pathSong))//当文件存在时
{
songLrc = System.IO.File.ReadAllLines(pathSong);//全部读取
ForMatLrc(songLrc);//调用ForMatLrc方法
}
else
{
songLrc = null;//文件不存在歌词将为空
}
}
private void ForMatLrc(string[] Lrc)
{
List<string> lrcAfter = new List<string>();
for (int i = 0; i <Lrc.Length; i++)
{
string lrcTemp = Lrc[i];
string[] tempTemp = lrcTemp.Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);//去掉时间两边的'[', ']'
int a = tempTemp.Length;
for (int j = 0; j < tempTemp.Length; j++)
{
if (tempTemp[j].Contains(':'))
{
if(isTime(tempTemp[tempTemp.Length-1]))
{
continue;
}
else if (tempTemp[j] ==tempTemp[tempTemp.Length - 1])
{
continue;
}
else
{
lrcAfter.Add(tempTemp[j] + "|" + tempTemp[tempTemp.Length - 1]);
}
}
}
lrcAfter.Sort();//对集合进行排序
songLrc = lrcAfter.ToArray();//将集合转化为字符串数组
}
}
到这里,自己动手写的音乐播放器就没有什么难点了,只要自己细心,认真的去编码。将会自己完成播放器的编写工作的