入职阿里啦!听音乐不过瘾?自制一个音乐播放器(1)

这篇博客介绍了如何制作一个音乐播放器,包括实现双击播放、播放/暂停、停止、切换歌曲、删除歌曲、静音功能以及歌词同步等。还提及了涉及的Java技术和分布式技术在面试中的相关知识。
摘要由CSDN通过智能技术生成



.



[](https://gitee.com/vip204888/java-p7)双击音乐触发播放属性函数

===============================================================================



在添加好音乐之后,我们当然需要对音乐进行播放,在这里我们需要设置当双击音乐文件后,可以在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

        { }

        

    } 



[](https://gitee.com/vip204888/java-p7)播放或暂停控件属性函数

==============================================================================



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



实现代码如下:



//设置播放或者暂停按钮属性

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;

    }



    

} 



[](https://gitee.com/vip204888/java-p7)停止控件属性函数

===========================================================================



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



实现代码如下:



//设置停止控件属性

    private void button3_Click(object sender, EventArgs e)

    {

        musicPlayer.Ctlcontrols.stop();

        playorpause.Text = "播放";

    } 



.



[](https://gitee.com/vip204888/java-p7)点击下一曲控件函数

============================================================================



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



实现代码如下:



//点击下一曲

    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();

    } 



[](https://gitee.com/vip204888/java-p7)点击下一曲控件函数

============================================================================



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



实现代码如下:



//点击上一曲

    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();

    } 



[](https://gitee.com/vip204888/java-p7)音乐删除函数

=========================================================================



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



实现代码如下:



//点击删除

    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);

        }

        

    } 



[](https://gitee.com/vip204888/java-p7)点击静音函数

=========================================================================



点击静音函数的作用是在我们点击之后,音乐静音,但此时的音乐仍然可以继续播放,该徐行与播放器的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";

        }

    } 



[](https://gitee.com/vip204888/java-p7)时间监控控件函数

===========================================================================



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



具体实现代码如下:



//时间监控控件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();

            }



        }



    } 



[](https://gitee.com/vip204888/java-p7)判断歌词是否存在函数

=============================================================================



了解音乐文件的小伙伴可能都知道,每一首音乐的歌词和音乐文件是相互独立的,通常情况下是音乐文件的文件名后加.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 = "未找到歌词......";

        }

    } 



[](https://gitee.com/vip204888/java-p7)歌词格式化函数

==========================================================================



**很多小伙伴可能不知道,起始看到的歌词都是进行过特殊处理的,真正的歌词文件并不是只有歌词的,它还包括每一句歌词应该播放的时间。**



如下所示:



![在这里插入图片描述](https://img-blog.csdnimg.cn/20200514150021952.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk4NTg4MA==,size_16,color_FFFFFF,t_70#pic_center)



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



具体的实现代码如下:



//定义存储歌词时间的列表

    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

最后

以上分享的全部分布式技术专题+面试解析+相关的手写和学习的笔记pdf,高清完整版戳这里免费领取

还有更多Java笔记分享如下:

//定义存储歌词时间的列表

    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

最后

以上分享的全部分布式技术专题+面试解析+相关的手写和学习的笔记pdf,高清完整版戳这里免费领取

还有更多Java笔记分享如下:

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值