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

  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];
                        }

                    }
                }


            }
        }

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

支持歌词同步的MP3播放器2007 - 只使用了 少量的控件 来完成程序 这样可让初级学者 学到很多东东 '- 1. 使用 CommonDialog 控件并支持多选 '- 2. LRC 控件 由佳诚工作室开发 提供 在此 不提供 控件源码 有兴趣的朋友可以和我 交流 '- 3. ListBox最常用的列表 控件 但 我们添加了 用其它的方法来 滚动 列表内容 支持拖拉文件到列表 '- 4. 其它按键 和 进度条 滑竿 都 是才用 源码 和 图片方式 组合 没生成控件 '- 这样 可以让初学者 知道初级的 控件的工作过程 和 如何制作控件 '- 5. 使用了 VB 自带 的 菜单 可以学到 如何调用其它窗体上的菜单 '- 6. 添加了 让程序支持 鼠标的滚轮 事件 用滚轮来调节歌词同步时间轴的位移 '- 7. 界面方面 全部采用贴图 和 窗体剪切 来实现 '- 8. 解码播放方面 使用 MIC 和 API 来 实现 可以 自动识别 调用系统 已经安装的 '- 解码器 像最新的RMVB 也可以 '- API 打来文件夹浏览 如果要修改搜索文件过滤 请修改sarch1 模块类 的分类 参数 '- 其它方面不完善的 和 错误方面 就由 你们来自由发挥了 ~~~ '- 歌词搜索 是按 歌曲名称 相同目录下的LRC 尾追 文件搜索 如果目录不存在 就在网络上自动下载 '- 歌词显示窗体支持透明显示和其它功能 所有功能键都在 每个窗体的右键上 都不同 '- 9. 歌词编辑功能 就不多介绍了 你们自己看吧
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值