责编 | 夕颜
出品 | 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++)
{
//将音乐文件的全路径加入到列表中
listpath.Add(path[i]);
//将音乐文件名添加到列表
listBox1.Items.Add(Path.GetFileName(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.duration.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;
}
}
停滞控件属性函数
该函数的浸染是:当用户点击停滞之后,当前正在播放的音乐停滞并且回到最初位置。
实当代码如下:
//设置停滞控件属性
private void button3_Click(object sender, EventArgs e)
{
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\公众);
}
播放歌词函数
当我们检测到将要播放的歌曲存在歌词文件时,就会对其歌词文件进行格式化处理,并且将歌词实时的播放出来,这时就须要定义其余的一个韶光监控控件,来对歌词的播放韶光进行监控,并且可以根据韶光实时的显示出须要播放的歌词。
详细实当代码如下:
//播放歌词
private void timer2_Tick(object sender, EventArgs e)
{
//label_lyric.Text = \"大众即将播放歌词...\"大众;
for (int i = 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格式,将空格删除再进行歌词显示处理。
版权声明:本文为CSDN博主「灰小猿」的原创文章,遵照CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44985880/article/details/106120326
☞程序员之痛:六次创业五回失落败了
☞研发的未来在哪里?Serverless 云开拓来了!
☞张一鸣是如何练就字节跳动的
☞性能超越最新序列推举模型,华为诺亚方舟提出影象增强的图神经网络
☞DevOps 在移动运用程序开拓中扮演什么角色?
☞稳定币经济:十大稳定币简史