【C#】播放器

本文围绕WinForm音乐播放器展开,介绍了打开WindowsMediaPlayer控件的步骤,阐述了其基本属性,如控制播放、音量等。还讲解了音乐文件OpenFileDialog的使用,歌曲列表的存放,媒体状态的判断,timer控件的功能实现以及歌词的显示处理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


打开控件

在这里插入图片描述
新建一个WinForm应用程序
在工具箱中找到“菜单和工具栏”
-> 右键
-> 选择项
-> COM组件
-> WindowsMediaPlayer
-> 添加到工具箱
拖入,重命名


基本属性

  • 控制播放歌曲:将歌曲的全路径名放到URL中

      <axWindowsMediaPlayer>.URL
    
            //比如这个时候播放器中有一首歌曲
            MusicPlayer.URL = @"E:\C#项目\4Day\张晏铭 - 佳佳.mp3";
  • 控制是否自动播放

     <axWindowsMediaPlayer>.settings.autoStart
    
 			//在窗体加载的时候我们就禁止播放器自动播放歌曲
            MusicPlayer.settings.autoStart = false;
  • 控制播放、暂停和停止

     <axWindowsMediaPlayer>.Ctlcontrol.player();
     <axWindowsMediaPlayer>.Ctlcontrol.pause();
     <axWindowsMediaPlayer>.Ctlcontrol.stop();
    
  		private void btnPlay_Click(object sender, EventArgs e)
        {
            //播放音乐
            MusicPlayer.Ctlcontrols.play();
        }

        private void btnPause_Click_1(object sender, EventArgs e)
        {
            //音乐暂停
            MusicPlayer.Ctlcontrols.pause();
        }

        private void btnStop_Click_1(object sender, EventArgs e)
        {
            //音乐停止
            MusicPlayer.Ctlcontrols.stop();
        }
  • 控制单击切换play和pause
     	/// <summary>
        /// 播放和暂停合并成一个按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPlayAndPause_Click(object sender, EventArgs e)
        {
            if (btnPlayAndPause.Text == "播放")
            {
                MusicPlayer.Ctlcontrols.play();
                btnPlayAndPause.Text = "暂停";
            }
            else if (btnPlayAndPause.Text == "暂停")
            {
                MusicPlayer.Ctlcontrols.pause();
                btnPlayAndPause.Text = "播放";
            }
        }
  • settings.mute属性 静音
     /// <summary>
        /// 静音
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void labMu_Click(object sender, EventArgs e)
        {
            if (labMu.Tag.ToString() == "1.jpg")
            {

                MusicPlayer.settings.mute = true;//静音
                labMu.Image = Image.FromFile(@"E:\C#项目\4Day\2.jpg");
                labMu.Tag = "2";
            }
            else if (labMu.Tag.ToString() == "2.jpg")
            {
                MusicPlayer.settings.mute = false;
                labMu.Image = Image.FromFile(@"E:\C#项目\4Day\1.jpg");
                labMu.Tag = "1";
            }
        }
  • settings.volume属性 控制音量
       /// <summary>
        /// 增加音量
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnVOL2_Click(object sender, EventArgs e)
        {
            MusicPlayer.settings.volume -= 5;
        }
        /// <summary>
        /// 减小音量
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnVOL1_Click(object sender, EventArgs e)
        {
            //每次音量增加5
            MusicPlayer.settings.volume += 5;
        }

        /// <summary>
        /// 下一曲
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNext_Click(object sender, EventArgs e)
        {
            //获取当前选中的索引
            int index = listMusicName.SelectedIndex;
            index++;//让索引加1
            //判断如果索引超出歌曲列表的总数就重新赋值为0
            if (index == listMusicName.Items.Count)
            {
                index = 0;
            }
            //listMusicName.SelectedItem=listMusicName.Items[index];
            //改变选中的歌曲
            listMusicName.SelectedIndex = index;
            //把选中的后歌曲的路径给URL
            MusicPlayer.URL = listMusicFile[index];
            //播放歌曲
            MusicPlayer.Ctlcontrols.play();
        }
       /// <summary>
        /// 上一曲
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnUp_Click(object sender, EventArgs e)
        {
            //获取当前选中的索引
            int index = listMusicName.SelectedIndex;
            index--;//让索引加1
            //判断如果索引超出歌曲列表的总数就重新赋值为0
            if (index < 0)
            {
                index = listMusicName.Items.Count - 1;
            }
            //listMusicName.SelectedItem=listMusicName.Items[index];
            //改变选中的歌曲
            listMusicName.SelectedIndex = index;
            //把选中的后歌曲的路径给URL
            MusicPlayer.URL = listMusicFile[index];
            //播放歌曲
            MusicPlayer.Ctlcontrols.play();
        }

音乐文件OpenFileDialog

OpenFileDialog ofd = new OpenFileDialog();

ShowDialog()方法
DialogResult枚举(OK和Cancel)
InitialDiectory属性
System.Environment.GetFolderPath()方法
System.Environment.SpecialFolder枚举
Filter属性
FileName属性、FileNames属性
Multiselect属性
Title属性


存放歌曲列表List<>

List<string> l = new List<string>();
List<string>与string[]

List为标准,播放与选择,与List同步
ListBox显示歌名
ListBox同步显示
count属性、add方法、addrange方法、chear方法
ListBox显示歌曲列表
显示歌曲名,非路径名
SelectedIndex属性,如果没选择,返回-1
SelectedItem属性,返回指定字符串

      	/// <summary>
        /// 添加音乐
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpen_Click(object sender, EventArgs e)
        {
            //点击这个按钮弹出一个对话框,我们可以浏览这个框里面的内容
            //然后把选中的歌曲全部添加到一个表中

            OpenFileDialog ofd =  new OpenFileDialog();//通过这个类我们打开文件
            ofd.Multiselect = true;//可以多选

            ofd.Title = "请选择音乐文件";//设置选择什么样的文件

            //设置初始的目录
            ofd.InitialDirectory = @"E:\C#项目\4Day";

            ofd.Filter = "(*.mp3)|*.mp3";

            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //获取选中的所有的歌曲的路径
                string[] fileNames = ofd.FileNames;
                for (int i = 0; i < fileNames.Length; i++)
                {
                    //把路径中的歌曲名截取出来
                    string musicName = fileNames[i].Substring(fileNames[i].LastIndexOf('\\') + 1);
                    //把选中的歌曲名字添加到listbox这个控件中
                    listMusicName.Items.Add(musicName);
                    //把歌曲的路径存到这个集合中去
                    listMusicFile.Add(fileNames[i]);
                    
                    //默认有一首歌是选中的
                    listMusicName.SelectedIndex = 0;
                    MusicPlayer.URL = listMusicFile[0];
                    //播放列表中有歌曲了,把播放按钮和停止按钮启用
                    btnPlayAndPause.Enabled = true;
                    btnStop.Enabled = true;
				}
            }
        }

为ListBox添加双击事件

		//双击这首歌曲播放
        private void listMusicName_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            //获取当前选中的歌曲的索引
            int index = listMusicName.SelectedIndex;

            //路径全都在泛型集合中
            //通过索引获取这首歌曲对应的路径,并且把路径给播放器的URL
            MusicPlayer.URL = listMusicFile[index];
            //播放这首歌曲
            MusicPlayer.Ctlcontrols.play();
            //把播放按钮的内容修改一下
            btnPlayAndPause.Text = "暂停";
        }

媒体状态

WMPLib.WMPPlayerState枚举
PlayState属性
Status属性
PlaySateChange事件

       	/// <summary>
        /// 自动播放下一曲
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MusicPlayer_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {
            if (MusicPlayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
            {
                int index = listMusicName.SelectedIndex;
                if (index == listMusicName.Items.Count - 1)
                {
                    index = 0;
                }
                else
                {
                    index++;
                }
                MusicPlayer.URL = listMusicFile[index];

                listMusicName.SelectedIndex = index;
            }

            if (MusicPlayer.playState == WMPLib.WMPPlayState.wmppsReady)
            {
                //播放歌曲
                try
                {
                    MusicPlayer.Ctlcontrols.play();
                    btnPlayAndPause.Text = "暂停";
                }
                catch
                {
                }
            }
        }

timer控件

实现功能
显示歌曲名、播放时间、播放状态
同步进度条
歌名滚动显示

      	/// <summary>
        /// 显示音乐正在播放的时间和歌曲名称
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            //显示音乐正在播放的时间
            if (MusicPlayer.currentMedia != null)
            {
                //显示音乐播放的时间
                labTime.Text = MusicPlayer.Ctlcontrols.currentPositionString;
                //显示歌曲名称
                labMusicName.Text = MusicPlayer.currentMedia.name;
            }

            #region 状态显示
            if (MusicPlayer.currentMedia != null)//判断不为空
            {
            //基本属性
                label2.Text = string.Format("{0}\r\n{1}\r\n{2}\r\n{3}\r\n{4}\r\n{5}\r\n声音:{6}\r\n{7}",
                                   MusicPlayer.currentMedia.duration,//(总秒数)
                                   MusicPlayer.currentMedia.durationString,//(总时间)
                                   MusicPlayer.currentMedia.name,//(歌曲名字)
                                   MusicPlayer.currentMedia.sourceURL,//(歌曲的地址)
                                   MusicPlayer.Ctlcontrols.currentPosition,
                                   MusicPlayer.Ctlcontrols.currentPositionString,//(音乐的开始播放时间0)
                                   MusicPlayer.settings.mute,//(音乐的静音)
                                   MusicPlayer.settings.volume//(声音的大小)
                    );
            }
            #endregion
        }

歌词的显示

得到歌曲名相同的歌词

System.IO.File.Exsits()方法
System.IO.File.ReadAllLines()方法

处理歌词格式化
歌词排序
显示算法

String.Compare()方法
using System.IO;

		//用来存歌词的路径
        List<string> listLrc = new List<string>();
        //用来存歌词
        List<string> listSongLrc = new List<string>();
        /// <summary>
        /// 添加音乐
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpen_Click(object sender, EventArgs e)
        {

                   //找这首歌曲的歌词
                    string strLrc = fileNames[i].Substring(0, fileNames[i].LastIndexOf('.')) + ".lrc";
                    //判断这个路径下是否有这个歌词文件
                    if (File.Exists(strLrc))
                    {
                        //有这个歌词就把歌词路径添加到集合中
                        listLrc.Add(strLrc);
                        //把读出来的歌词直接存到集合中
                        listSongLrc.AddRange(File.ReadAllLines(strLrc, Encoding.UTF8));
                    }
                    else
                    {
                        //否则提示没有找到歌词
                        labSong.Text = "未找到歌词";
                    }
        }
       	/// <summary>
        /// 格式化歌词
        /// </summary>
        /// <returns></returns>
        private List<string> FormatLrc()
        {
            //定义一个集合用来存处理好的歌词
            List<string> list = new List<string>();
            //遍历存未切割好的歌词
            for (int i = 0; i < listSongLrc.Count; i++)
            {
                //把每一句歌词都要切割
                string[] lrc = listSongLrc[i].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);
                //判断切割好的内容的长度是否大于1
                if (lrc.Length > 1)
                {
                    //如果大于1证明有时间也有歌词
                    for (int j = 0; j < lrc.Length - 1; j++)
                    {
                        //把歌词和时间全部存到这个集合中去
                        list.Add(lrc[j] + "|" + lrc[lrc.Length - 1]);
                    }
                }
            }
            //把歌词排序
            for (int i = 0; i < list.Count - 1; i++)
            {
                for (int j = 0; j < list.Count - 1 - i; j++)
                {
                    if (string.Compare(list[j], list[j + 1]) > 0)
                    {
                        string temp = list[j];
                        list[j] = list[j + 1];
                        list[j + 1] = temp;
                    }
                }
            }
            //File.WriteAllLines(@"E:\C#项目\4Day\1.txt", list);
            return list;
        }
    /// <summary>
        /// 显示音乐正在播放的时间和歌曲名称
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            //显示歌词
            //上一句歌词播放的时间	当前音乐 播放的时间   下一句歌词播放的时间 

            if (listSongLrc.Count > 0 && MusicPlayer.currentMedia != null)
            {
                //获得当前歌曲播放的时间
                string time = MusicPlayer.Ctlcontrols.currentPositionString;

                //遍历歌词
                for (int i = 0; i < listSongLrc.Count - 1; i++)
                {
                    if (string.Compare(listSongLrc[i], time) < 0 && string.Compare(time, listSongLrc[i + 1]) < 0)
                    {
                        labSong.Text = listSongLrc[i].Split('|')[1];
                    }
                }
            }

感谢阅读~

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张_Laura

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值