- 打开对话框,选中歌曲,将歌曲名添加到listBox框中
2.通过切割歌曲的路径,可以找到相同路径下歌词的文件(.lrc)
以下代码是1和2的整体代码
private void btnOpen_Click(object sender, EventArgs e) //打开按钮的功能
{
//通过这个类我们打开文件
OpenFileDialog ofd = new OpenFileDialog();
//可以多选
ofd.Multiselect = true;
//设置选择什么样的文件
ofd.Title = "请选择音乐文件";
//设置初始的目录
ofd.InitialDirectory = @"C:\Users\李晨璐\Music";
//设置显示文件的类型
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这个控件中
listMusic.Items.Add(musicName);
//把歌曲的路径存到这个集合中去
listMusicFile.Add(fileNames[i]);
//找这首歌曲的歌词
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 = "未找到歌词";
}
}
listSongLrc = FormatLrc();
//默认有一手歌曲是被选中的
listMusic.SelectedIndex = 0;
axWindowsMediaPlayer1.URL = listMusicFile[0];
//播放列表中有歌曲了,把播放按钮和停止按钮启用
btnPlayAndPause.Enabled = true;
btnStop.Enabled = true;
}
}
3. 将歌词文件中的内容进行切割成以下的格式
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]);
}
}
}
4.根据“|”左边的时间和当前音乐播放时间判断,可以算出一句歌词需要在哪个时间段播放,在显示出相应的歌词,就可以了(“|”右边)
private void timer1_Tick(object sender, EventArgs e) //音乐播放时间,名称,显示歌词
{
//判断歌名是否为空
if (axWindowsMediaPlayer1.currentMedia != null)
{
//显示音乐播放时间
labTime.Text = axWindowsMediaPlayer1.Ctlcontrols.currentPositionString;
//显示音乐播放名称
labMusicName.Text = axWindowsMediaPlayer1.currentMedia.name;
//显示歌词
//上一句歌词播放时间 当前歌曲播放时间 下一句歌词播放的时间
//(有歌词)
if (listSongLrc.Count>0&&axWindowsMediaPlayer1.currentMedia!=null)
{
//获得当前歌曲播放的时间
string time = axWindowsMediaPlayer1.Ctlcontrols.currentPositionString;
//遍历歌词
for (int i = 0; i < listSongLrc.Count-1; i++)
{
//上一句歌词播放时间<当前时间 and 当前时间<下一句歌词播放的时间
if (string.Compare(listSongLrc[i], time)<0&&string.Compare(time, listSongLrc[i+1])<0)
{
labSong.Text = listSongLrc[i].Split('|')[1];
}
}
}
}
}
以上就是基本的逻辑和代码展示