听音乐不过瘾?自制一个音乐播放器!,java 开发实战经典第二版百度网盘

.
现在当我们知道我们的播放器需要实现哪些功能以后,就是我们搭建整个播放器的界面和函数方法的阶段了,在 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 = null;
//设置上方的标题框名称
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 music_up_Click(object sender, EventArgs e)
{
int index = listBox1.SelectedIndex;
listBox1.SelectedIndices.Clear();
index--;
//如果此时是第一首歌曲,则索引减一为-1
if (index == -1)
{
//listBox1.Items.Count 记录的是歌曲数目,
//如果跳转到最后一首,索引是数目减一
index = listBox1.Items.Count - 1;
}
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);
}
}
=========================================================================
点击静音函数的作用是在我们点击之后,音乐静音,但
《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
此时的音乐仍然可以继续播放,该徐行与播放器的 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)
总结
无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视 JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

评论