基于C#的酷狗音乐播放器
在这学期的桌面应用设计课上,老师带领我们做了一个模仿酷狗音乐盒的音乐播放器,虽然最终的播放器做得比较粗糙,但基本的播放功能和歌词滚动功能都实现,并将项目打包成Windows安装程序,废话不多说,下面来看一下它的实现过程吧。
- 新建窗体项目
打开Visual Studio 点击 “文件-新建-项目-Visual C#项目-windows窗体应用”,将项目新建到合适的位置,本人建议将同一语言的项目都保存在一个文件夹中。
- 添加WindowsMediaPlayer组件
本次项目为了简便起见,使用了C#的WindowsMeidaPlayer组件来进行歌曲的播放,该组件的添加方式为Visual Studio中点击”工具-选择工具箱项-COM组件-找到WindowMediaPlayer组件”然后点击确定,WindowMediaPlayer组件就添加到项目中了。
- 向窗体添加axWindowsMediaPlayer控件
在添加完WindowsMediaPlayer组件后,工具箱控件栏就会多出一个WindowsMediaPlayer控件,我们将他拖动到Form窗体上便实现了播放器的添加.(若没有工具箱界面的请点击”视图-工具箱”或者直接Ctrl+Alt+X就能调出工具箱界面)
- 界面设计
界面设计一直都是软件开发比较头疼的问题,读者可以参照酷狗音乐盒的真实界面来进行模仿,也可以在它的基础上进行创新,界面设计我是这么做的,在form的底部添加一个Panel控件,将其颜色设为半透明,然后再在上面添加播放、上一曲、下一曲、进度条、循环模式、音量调节、歌曲列表按钮(不要拖button按钮,拖picturebox,再去图标网站上下载各式图标设置picturebox的图片,button太丑了),其他的读者可以在此基础上进行创新,争取把界面设计的更出色。
- 播放歌曲
有了axWindowsMediaPlayer之后,我们就可以播放歌曲了,具体方式为将axWindowsMediaPlayer对象的URL设置为你要打开的音乐文件,我们在Form类中新建一个play方法,表示播放歌曲,代码如下:
1 //播放歌曲 2 public bool play(String filename) 3 { 4 if (File.Exists(filename)) 5 { 6 //mediaplayer播放 7 axplayer.URL = filename;//播放歌曲 8 SongInfoLbl lbl = (SongInfoLbl)pnl_songlist.Controls[Index]; 9 lbl.setisplay(); 10 Set_SongList_isplay(lbl); 11 if (!LoadLyric(filename))//载入歌词 12 { 13 lbl_LyricState.Text = " 当前暂无歌词\n点击添加歌词文件"; 14 } 15 else 16 { 17 lbl_LyricState.Text = ""; 18 for (int i = 0; i < lyricfile.Lyric_List.Count; i++) 19 { 20 initpostion.Add(i * 30 + 150); 21 postion.Add(i * 30 + 150); 22 } 23 } 24 return true; 25 } 26 else 27 { 28 return false;//文件打开失败则播放错误 29 } 30 }
- 载入歌词
前面的play方法中有一个调用方法LoadLyric(filename),该方法就是用来载入歌词的,因为作为一个播放器,如果只能播放歌曲而不能显示歌词的话那就太单调了,因此我们添加了载入歌词的功能,但歌词文件的载入比较麻烦,在查看了歌词文件后,我们可以发现歌词文件都是以”[时间点]歌词内容”的形式来一行一行地储存的,那么我们就可以用FileStream来对歌词文件进行读取并提取出里面的时间点、歌词内容等,基础类型并不能保存这么多的信息,因此我们需要新建一个类Lyric,用该类就可以保存每行歌词的信息了。
歌词文件的特征:
Lyric类
1 class Lyric//用于保存歌词信息 2 { 3 public int minute;//分钟 4 public float second;//秒 5 public String strLyric;//具体歌词 6 public float totsecond;//总秒数 7 }
光有Lyric类还不够,因为歌词文件中的歌词不可能只有一行,
因此我们需要一个列表来保存歌词文件,我们为了方便将其抽象成LyricFile类,用于保存歌词文件的全部信息
1 //歌词文件 2 class LyricFile//用于保存歌词文件信息 3 { 4 //数据 5 public List<Lyric> Lyric_List= new List<Lyric>();//歌词列表 6 //方法 7 public bool LoadLyricFromFile(string filename)//从文件载入歌词 8 { 9 if (File.Exists(filename)) 10 { 11 //从文件载入歌词 12 Encoding encoder = Encoding.GetEncoding("GB2312"); 13 FileStream fs = new FileStream(filename, FileMode.Open); 14 StreamReader sr = new StreamReader(fs, encoder); 15 16 17 String strlyric;//保存歌词 18 while ((strlyric = sr.ReadLine()) != null) 19 { 20 if (strlyric == "") 21 { 22 continue;//若有空行则跳过该次循环 23 } 24 Lyric lyric = new Lyric(); 25 try 26 { 27 lyric.minute = Convert.ToInt32(strlyric.Substring(1, 2));//从第二个开始 28 lyric.second = Convert.ToSingle(strlyric.Substring(4, 5));//从第五个开始 29 lyric.strLyric = strlyric.Substring(10); 30 31 lyric.totsecond = (float)(lyric.minute * 60 + lyric.second); 32 33 Lyric_List.Add(lyric);//加入歌词 34 }catch(Exception e) 35 { 36 continue; 37 } 38 } 39 40 sr.Close(); 41 fs.Close(); 42 return true; 43 } 44 else 45 { 46 return false; 47 } 48 } 49 }
- 显示歌词
在歌词文件成功载入后,我们需要在主界面对歌词进行显示。
主界面载入歌词LoadLyric
1 LyricFile lyricfile = new LyricFile();//保存歌词文件 2 List<int> postion = new List<int>();//保存每行歌词的位置 3 //载入歌词 4 private bool LoadLyric(String filename) 5 { 6 bool flag= lyricfile.LoadLyricFromFile(filename); 7 for (int i = 0; i < lyricfile.Lyric_List.Count; i++) 8 { 9 postion.Add(i * 30 + 150);//设置歌词输出的位置 10 } 11 return flag; 12 }
显示歌词ShowLyric时使用了GDI+进行歌词的绘制
1 private void ShowLyric() 2 { 3 Graphics g = this.CreateGraphics(); 4 for(int i=0;i<lyricfile.Lyric_List.Count;i++) 5 { 6 g.DrawString(lyricfile.Lyric_List[i].strLyric, new Font("宋体", 13), Brushes.Coral, new Point(300, postion[i])); 7 } 8 g.Dispose(); 9 }
- 歌词滚动
至此我们已经实现了歌曲的播放和歌词的载入了,但歌词光是静态不动可不行,当歌曲播放时歌词应当随之滚动并显示当前播放的是哪句歌词,在这里我们可以使用歌词的时间点来进行判断,因为在axWindowsMediaPlayer中有播放时间的属性用来记录当前歌曲的播放时间和总时长,由于歌词需要刷新,因此我们可以在的paint事件中放置我们的歌词滚动方法,再向窗体拖入一个Timer控件,当随着时间流逝时改变歌词的位置和当前行的位置,这样就实现了歌词的滚动.
Initpostion列表保存歌词的初始位置
currentline字段表示当前播放的是哪一行歌词
画出歌词DrawLyric
1 1 //画出歌词 2 2 public void DrawLyric() 3 3 { 4 4 Graphics g = this.CreateGraphics(); 5 5 if (isPlay) 6 6 { 7 7 if (lyricfile.Lyric_List.Count > 0) 8 8 { 9 9 for (int i = 0; i < postion.Count; i++) 10 10 { 11 11 if (currentline == i)//当前行颜色为黄 12 12 { 13 13 g.DrawString(lyricfile.Lyric_List[i].strLyric, new Font("宋体", 13), Brushes.Yellow, new Point(300, postion[i])); 14 14 } 15 15 else 16 16 { 17 17 g.DrawString(lyricfile.Lyric_List[i].strLyric, new Font("宋体", 13), Brushes.Coral, new Point(300, postion[i])); 18 18 } 19 19 20 20 } 21 21 } 22 22 } 23 23 }
Timer方法歌词滚动
1 int currentline = 0; 2 private void timer1_Tick(object sender, EventArgs e) 3 { 4 double pos = axplayer.Ctlcontrols.currentPosition;//获取当前播放的时间 5 if (lyricfile.Lyric_List.Count > 0) 6 { 7 if (currentline + 1 < lyricfile.Lyric_List.Count) 8 { 9 if (pos > lyricfile.Lyric_List[currentline + 1].totsecond)//若当前时间超过歌词时间则切换下一行 10 { 11 currentline++;//当前播放行数加1 12 for (int i = 0; i < postion.Count; i++) 13 { 14 postion[i] -= 30;//歌词向下滚动 15 } 16 } 17 } 18 } 19 }
这样随着歌曲的播放歌词会向上滚动
- 进度条切换播放时间
综上我们实现了歌曲的播放、歌词的载入、歌词的滚动,但歌曲也只能顺序播放而无法切换到某个特定的位置,因此我们向窗体中拖入了一个进度条,用于切换歌曲播放的进度,由于C#自带的trackbar太丑,于是我自己设计了一个进度条,用一个panel将它的高度设成2和一个picturebox组成,当点击panel的某个地方时,歌曲就会跳转到相应的时间点。
歌曲跳转
1 //改变进度 2 private void changeprogress(int X)//X表示在panel上点击的位置 3 { 4 float x = (float)(X); 5 float y = (float)pnl_progress.Width; 6 double progress = (float)(x / y);//切换的进度 7 8 axplayer.Ctlcontrols.currentPosition = axplayer.currentMedia.duration * progress;//切换歌曲进度 9 }
至此音乐盒的基本功能就实现完了,具体实现可以参照我的项目码云地址:https://gitee.com/zhaoxiaoqin/KuGoumusic_player.git
接下来我们可以将项目进行打包成setup安装程序
具体实现如下:
- 下载Microsoft Visual Studio 2017 Installer插件并安装
进入Visual Studio中点击”工具-扩展和更新-联机-搜索Microsoft Visual Studio 2017 Installer-下载-重启Visual Studio”
- 新建打包项目
将Microsoft Visual Studio 2017 Installer插件安装好之后,就可以新建打包项目了
“右击你的解决方案-添加-新建项目-其他项目类型-Visual Studio Installer-Setup Project”,将项目放置在合适的位置
- 添加打包文件
在新建了Setup项目后可以看到如下界面:
其中Application Folder就是存放你的项目文件的地方,将你项目必须的文件都放到这个文件夹中
User’s Desktop是用户安装后桌面快捷方式的文件夹
User\’s Programs Menu是存放安装后文件夹的地方
“右击Application Folder-Add-项目输出-选择你的项目名称-点击主输出-确定”
在Application Folder中就会自动生成一些项目必须的文件
然后”右击主输出文件-Create Shortcut”,创建快捷方式,并将该快捷方式拖到User’s Desktop文件夹中,
用于显示安装后的程序。
- 生成setup安装文件
在解决方案资源管理器中找到setup项目,右击该项目点生成
下方显示生成成功后
我们在Setup1\Debug文件夹中可以看到两个文件
这两个文件便是你的项目的安装程序,点击setup.exe后打开安装程序就可以进行项目的安装了。
综上酷狗音乐盒的编写就介绍完了,详细代码可以从我的码云上下载
码云地址:https://gitee.com/zhaoxiaoqin/KuGoumusic_player