音乐播放器---歌词显示逻辑篇

  1. 打开对话框,选中歌曲,将歌曲名添加到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];
                        }

                    }
                }


            }
        }

以上就是基本的逻辑和代码展示

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值