音乐播放器代码(听音乐不过瘾?自制一个音乐播放器!)

/ 0评 / 0

音乐播放器代码(听音乐不过瘾?自制一个音乐播放器!)

作者 | 灰小猿

责编 | 夕颜

出品 | CSDN博客

最近在学习C#的GUI编程时想着自制一个播放器,说干就干。

其实C#除了在游戏开发上具有明显优势以外,在winform交互页面设计和web网站开发上也是独树一帜的。

那么对于应用C#自己开发一个音乐播放器,首先应当懂得的当然就是播放器的根本构成了,究竟知己知彼方能百战不殆嘛,和我们平凡应用的音乐播放器一样。

我们制造的播放器当然也应当具有对音乐的添加、删除、多选、静音、暂停、停滞、切换、

同时为了更加符合常用播放器的应用习惯,我们当然还须要添加主动切换下一曲、实时时光显示、播放器屏幕等根本操作啦。

现在当我们知道我们的播放器须要实现哪些功效以后,就是我们搭建全部播放器的界面和函数办法的阶段了,在VS软件的设计界面,我们可以很轻松的对播放器的界面进行整体布局。

同时我们所添加的每一个控件都有它奇特的属性,我们可以对控件的属性进行个性化的设置,增长我们更好的体验感。

下面这个是大灰狼搭建的播放器界面,小伙伴们可以参考,其中播放器所需的根本界面和所需的功效都有实现。

在界面设计完成以后,就是后端函数的书写操作了。

打开音乐文件控件函数

该函数的目标是为了我们从体系文件中添加音乐文件。

根本思路是:先定义一个寄存每一首音乐路径的列表,然后在选择音乐文件之后,依次将所选音乐文件的路径添加到路径列表之中。其中须要注意的是:我们须要设置音乐的起始默认打开地位和所选择的音乐格局,一般来说音乐的格局有mp3、WAV、flac等,在属性中设置音乐格局时应注意,每一个格局应当应用分号进行分割开。

函数实现代码如下:

//定义一个列表寄存文件路径 List<string> listpath = new List<string>;
//设置打开音乐文件属性 private void openmusic_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog;
//设置音乐的起始默认打开地位 ofd.InitialDirectory = @"‪C:/Users/郭运刚/Music";
//设置可以匹配的音乐格局 ofd.Filter = "MP3文件|*.mp3;*.wav"; //ofd.Filter = ;
//设置上方的题目框名称 ofd.Title = "请选择音乐文件!";
//设置许可多选 ofd.Multiselect = true; ofd.ShowDialog;
//获取所选文件的全路径 string path = ofd.FileNames;
for (int i = 0; i < path.Length; i(www.isoyu.com原创版权)++) { //将音乐文件的全路径参加到列表中 listpath.Add(path[i]);
//将音乐文件名添加到列表 listBox1.Items.Add(Path.GetFileNa百思特网me(path[i])); } }

双击音乐触发播放属性函数

在添加好音乐之后,我们当然须要对音乐进行播放,在这里我们须要设置当双击音乐文件后,可以在musicplayer播放器中进行播放。

该函数须要注意的处所是:我们须要对寄存音乐文件的列表进行断定,如果音乐列表为零,也就是说当前并没有可以播放的音乐的时候,我们须要对用户进行提醒。同时在我们双击播放音乐之后,我们先前设置的播放音乐的控件,此刻应当显示的是暂停选项。

实现代码如下:

//双击音乐触发播放属性 private void listBox1_DoubleClick(object sender, EventArgs e) { if (listBox1.Items.Count == 0) { MessageBox.Show("请先选择播放音乐!"); return; } try { musicPlayer.URL = listpath[listBox1.SelectedIndex]; musicPlayer.Ctlcontrols.play; playorpause.Text = "暂停"; //timer1_Tick_1(sender, e); //music_plan.Text = musicPlayer.currentMedia.d百思特网uration.ToString;
//调用函数去处置这个路径下的这首歌的歌词 IsExistlrc(listpath[listBox1.SelectedIndex]); } catch { }
}

播放或暂停控件属性函数

该控件函数的作用,顾名思义,当然就是掌握音乐的播放和暂停,同时须要注意的处所是,当我们点击音乐播放的时候,应当让音乐持续之前的播放,而不是重新开端。同时在我们点击播放或者暂停按钮之后,该控件应当有对应的显示。

实现代码如下:

//设置播放或者暂停按钮属性 private void playorpause_Click(object sender, EventArgs e) { if (playorpause.Text == "播放") {
//来个异常,防止列表没有音乐 try { //如果持续单击播放,那就让他接着放 if (b) { musicPlayer.URL = listpath[listBox1.SelectedIndex];
} } catch { } musicPlayer.Ctlcontrols.play; playorpause.Text = "暂停"; } else if (playorpause.Text == "暂停") { musicPlayer.Ctlcontrols.pause; playorpause.Text = "播放"; b = false; }
}

停滞控件属性函数

该函数的作用是:当用户点击停滞之后,当前正在播放的音乐停滞并且回到最初地位。

实现代码如下:

//设置停滞控件属性privatevoidbutton3_Click(objectsender,EventArgse){musicPlayer.Ctlcontrols.stop;playorpause.Text="播放";}

点击下一曲控件函数

该函数的作用是:当我们点击下一曲的时候,可以依据当前播放的音乐列表,播放列表中的下一首歌曲。

实现代码如下:

//点击下一曲 private void music_down_Click(object sender, EventArgs e) { //获取当前歌曲索引地位 int index = listBox1.SelectedIndex;
//清空歌曲选择索引 listBox1.SelectedIndices.Clear;
index++; if (index == listBox1.Items.Count) { index = 0; } listBox1.SelectedIndex = index; musicPlayer.URL = listpath[index]; musicPlayer.Ctlcontrols.play; }

音乐删除函数

该函数是将我们已经寄存到音乐列表中的音乐进行删除,当我们单击选择某一首音乐后,可以将其从列表中删除。并且不会在主动播放时播放该音乐。

实现代码如下:

 //点击删除 private void 删除ToolStripMenuItem_Click(object sender, EventArgs e) { //获取已经选中歌曲的数目 int count = listBox1.SelectedItems.Count;
//删除列表中的选中项 for (int i = 0; i < count; i++) { //首先删除聚集中的歌曲 listpath.RemoveAt(listBox1.SelectedIndex); //再删除寄存在列表里的歌曲 listBox1.Items.RemoveAt(listBox1.SelectedIndex); }
}

点击静音函数

点击静音函数的作用是在我们点击之后,音乐静音,但此时的音乐仍然可以持续播放,该徐行与播放器的settings.mute函数有关。

该函数的实现思路是:我们须要对当前音乐是否静音进行一个设定,由于Text静音控件的文本永远都是不变的,所以我们须要借助该控件下的Tag属性进行赋值断定,

具体实现代码如下:

 //点击静音函数 private void label1_Click(object sender, EventArgs e) { if (label1.Tag.ToString == "1") { musicPlayer.settings.mute = true;
//label1.Image = Image.FromFile(@"‪C:/Users/郭运刚/Pictures/320578.png"); label1.Tag = "2"; } else if (label1.Tag.ToString == "2") { musicPlayer.settings.mute = false; //label1.Image = Image.FromFile(@"C:/Users/郭运刚/Pictures/Saved Pictures/322557.png"); label1.Tag = "1"; } }

时光监控控件函数

该函数须要我们在添加时光控件之后,与时光监控控件绑定应用,该函数的作用是实时的对播放的音乐进行监控,并且返回当前的播放时光,

具体实现代码如下:

//时光监控控件1 private void timer1_Tick_1(object sender, EventArgs e) { //music_plan.Text = "测试"; //如果播放器的状况是正在播放中 if (musicPlayer.playState == WMPLib.WMPPlayState.wmppsPlaying) { //music_plan.Text = "播放"; music_plan.Text = musicPlayer.currentMedia.duration.ToString + "\r\n" + musicPlayer.currentMedia.durationString + "\r\n" + musicPlayer.Ctlcontrols.currentPosition.ToString + "\r\n" + musicPlayer.Ctlcontrols.currentPositionString;
double t1 = double.Parse(musicPlayer.currentMedia.duration.ToString); double t2 = double.Parse(musicPlayer.Ctlcontrols.currentPosition.ToString) + 1; if ( t1 <= t2) { //获取当前歌曲索引地位 int index = listBox1.SelectedIndex;
//清空歌曲选择索引 listBox1.SelectedIndices.Clear;
index++; if (index ==百思特网 listBox1.Items.Count) { index = 0; } listBox1.SelectedIndex = index; musicPlayer.URL = listpath[index]; musicPlayer.Ctlcontrols.play; }
}
}

断定歌词是否存在函数

懂得音乐文件的小伙伴可能都知道,每一首音乐的歌词和音乐文件是相互独立的,通常情形下是音乐文件的文件名后加.lrc为其所对应的歌词文件,所以当我们播放一首歌曲的时候,就须要我们对该歌曲的歌词文件进行断定,断定当前播放的音乐是否具有歌词文件。

如果有,则进行歌词尺度化和歌词播放函数,如果没有,当然须要对用户进行相应的提醒“未找到歌词”

实现代码如下:

//断定歌词是否存在 void IsExistlrc(string songPath) { //每次制造歌词前先清空寄存时光和歌词的列表 listlrcTime.Clear; listlrcText.Clear;
songPath += ".lrc"; //MessageBox.Show(songPath); bool fileIn = File.Exists(songPath); if (fileIn) { //label_lyric.Text = "即将播放歌词"; //定义一个寄存歌词的列表,获取到歌词文件中的内容 string lrcText = File.ReadAllLines(songPath, Encoding.Default);
//如果歌词存在,则调用函数formatlrc格局化歌词 formatlrc(lrcText); } else { label_lyric.Text = "未找到歌词......"; } }

歌词格局化函数

很多小伙伴可能不知道,起始看到的歌词都是进行过特别处置的,真正的歌词文件并不是只有歌词的,它还包含每一句歌词应当播放的时光。

如下所示:

所以我们在显示歌词的时候,就须要对歌词文件进行特别化处置,让真正显示出来的只有歌词,这里就须要我们对每一句歌词文件进行分割,将获取到的播放时光和歌词,分离寄存到对应的列表汇总去。

具体的实现代码如下:

 //定义存储歌词时光的列表 List<double> listlrcTime = new List<double>; //定义寄存歌词的列表 List<string> listlrcText = new List<string>;
//定义存储歌词时光的列表 List<double> listlrcTime = new List<double>; //定义寄存歌词的列表 List<string> listlrcText = new List<string>;
//对歌词进行尺度格局化函数 void formatlrc(string [] lrcText) { for (int i = 0; i < lrcText.Length; i++) { //去掉歌词每一行前后的[、] string lrcTemp = lrcText[i].Split(new char[] { '[', ']'}, StringSplitOptions.RemoveEmptyEntries); //返回的数组中lrcTemp[0]是时光, 格局为00:00.00 //lrcTemp[1]是歌词
//去掉时光字符中的冒号“:” string lrcNewTemp= lrcTemp[0].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
//定义变量time表现时光 double time = double.Parse(lrcNewTemp[0]) * 60 + double.Parse(lrcNewTemp[1]);
//把每一次截取到的歌词时光放到lrctime列表中 listlrcTime.Add(time);
//MessageBox.Show("测试点1"); //把对应的每一次的歌词寄存到泛型列表listlrcText中 listlrcText.Add(lrcTemp[1]);
} //MessageBox.Show("测试点1"); }

播放歌词函数

当我们检测到将要播放的歌曲存在歌词文件时,就会对其歌词文件进行格局化处置,并且将歌词实时的播放出来,这时就须要定义另外的一个时光监控控件,来对歌词的播放时光进行监控,并且可以依据时光实时的显示出须要播放的歌词。

具体实现代码如下:

//播放歌词privatevoidtimer2_Tick(objectsender,EventArgse){//label_lyric.Text="即将播放歌词...";for(inti=0;i<listlrcTime.Count;i++){if(musicPlayer.Ctlcontrols.currentPosition>=listlrcTime[i]&&musicPlayer.Ctlcontrols.currentPosition<listlrcTime[i+1]){//MessageBox.Show("我要播放歌词了");//将该时光段的歌词在显示歌词的文本框显示label_lyric.Text=listlrcText[i];}}}

各个控件的函数办法完成以后,音乐播放器的根本功效就完成了,

其中值得注意的一点是,在进行歌词显示的时候,部分音乐的歌词文件中会隔行涌现空格,导致歌词格局化处置函数无法鉴别,建议先将歌词文件后缀修正为txt格局,将空格删除再进行歌词显示处置。