干货分享!听音乐不过瘾?自制一个音乐播放器

实现代码如下:


//双击音乐触发播放属性

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

            }

            

        } 

点击静音函数

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

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





# 面试准备+复习资料分享:

> 为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦,有需要的可以来找我获取哈

**[获取方式:点击蓝色字体即可免费获取](https://gitee.com/vip204888/java-p7)**

![秋招|美团java一面二面HR面面经,分享攒攒人品](https://img-blog.csdnimg.cn/img_convert/54384e991f0f261fe820c6ffaa86fd69.png)

 //返回的数组中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);





# 面试准备+复习资料分享:

> 为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦,有需要的可以来找我获取哈

**[获取方式:点击蓝色字体即可免费获取](https://gitee.com/vip204888/java-p7)**

[外链图片转存中...(img-y2CMxutZ-1628150610600)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值