基于WindowsMediaPlayer组件的简单播放器的设计

来源:互联网 发布:mac os x最新版本是 编辑:程序博客网 时间:2024/05/16 00:33

首先,在VS中创建一个Winform项目,然后在工具箱中组件中右键选择“选择项”,添加COM组件中的WindowMediaPlayer的组件

       设置该WindowMediaPlayer对象的Name为musicPlayer

       添加一个点击后可以播放或者暂停的按钮设计其Name属性btnPlayOrPause,Text属性为“播放”

       添加一个停止播放按钮设计其Name属性为btnStop,Text属性为"停止"

       添加一个打开文件按钮设计其Name属性为btnOpenFile,Text属性为"打开音乐文件"

       添加一个存放音乐文件名的列表框设计其Name属性为lboSongs ,设置其SelectionMode属性为MultiExtended(为了多项删除歌曲),ContextMenuStrip:ContextMenuStripOfLboSongs(绑定操作,之前需要添加一个ContextMenuStrip控件,Name:ContextMenuStripOfLboSongs)

      添加下一首按钮btnNextSong,Text:下一首

     添加上一首按钮btnLastSong,Text:上一首

      加大音量按钮btnAddVoice,Text:+

      加大音量按钮btnAddVoice,Text:-

     添加一个用来显示歌词的标签控件,Name:lbLrc

一、窗体加载时

<span style="font-size:24px;"> private void Form1_Load(object sender, EventArgs e)        {            //取消播放器的自动播放功能            musicPlayer.settings.autoStart = false;            //设置播放和暂停按钮不可用              btnPlayOrPause.Enabled = false;        }</span>

二、播放/暂停的实现

<pre name="code" class="csharp">        bool b = true;        private void btnPlayOrPause_Click(object sender, EventArgs e)        {            if (btnPlayOrPause.Text == "播放")            {                if (b)                {                     //实现单击从头播放选中的歌曲                    musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex];                }                musicPlayer.Ctlcontrols.play();                btnPlayOrPause.Text = "暂停";            }            else if (btnPlayOrPause.Text == "暂停")            {                musicPlayer.Ctlcontrols.pause();                btnPlayOrPause.Text = "播放";                b=false;            }        }

三、停止播放的实现

 private void btnStop_Click(object sender, EventArgs e)        {            //停止播放            musicPlayer.Ctlcontrols.stop();           //播放或者停止按钮的文本显示为播放           btnPlayOrPause.Text = "播放";        }

四 打开音乐文件添加到歌单的实现

//用来存储歌曲全路径的集合        List<string> listSongsPaths = new List<string>();        private void btnOpenFile_Click(object sender, EventArgs e)        {            OpenFileDialog ofd = new OpenFileDialog();            //对话框的标题            ofd.Title = "请您选择要打开的文件";            //是否多选            ofd.Multiselect = true;            //过滤文件类型            ofd.Filter = "所有文件|*.*|MP3文件|*.mp3";            //初始化打开路径            ofd.InitialDirectory = @"F:\音乐";            //显示打开对话框            ofd.ShowDialog();            //获取打开对话框中用户所选的全部文件的的全路径            string[] paths = ofd.FileNames;            for (int i = 0; i <paths.Length; i++)            {                //如果选取的文件的全路径在集合中不存在,将歌曲名存在到歌曲列表框中                if(!listSongsPaths.Contains(paths[i]))                {                                listSongsPaths.Add(paths[i]);                //仅存文件名                lboSongs.Items.Add(Path.GetFileNameWithoutExtension(paths[i]));                }              }                    }<span style="font-size:24px;">      </span>
 五、双击播放的实现 
 private void lboSongs_DoubleClick(object sender, EventArgs e)        {                        if (lboSongs.Items.Count == 0)            {                MessageBox.Show("请您先选择要播放的文件");                return;            }            //选中歌曲的路径给播放器的URL            //try-catch目的在于消除双击空白处的异常            try            {                musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex];                musicPlayer.Ctlcontrols.play();                //获取歌词                  GetLrc(listSongsPaths[lboSongs.SelectedIndex]);                btnPlayOrPause.Text = "暂停";            }            catch            {            }        }

六、下一首播放的实现

private void btnNextSong_Click(object sender, EventArgs e)        {            //获取lboSongs的当前索引            int index = lboSongs.SelectedIndex;            //清空所有选中的索引项            lboSongs.SelectedIndices.Clear();            index++;            //如果是最后一首的则索引设置到第一首            if (index == lboSongs.Items.Count)            {                index=0;            }            //将当前索引指向下一曲            lboSongs.SelectedIndex = index;            //播放下一首            musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex];            musicPlayer.Ctlcontrols.play();        }
七、上一首播放的实现

private void btnLastSong_Click(object sender, EventArgs e)        {            //获取lboSongs的当前索引            int index = lboSongs.SelectedIndex;            //清空所有选中的索引项,避免多选            lboSongs.SelectedIndices.Clear();            index--;            if (index == -1)            {                index = lboSongs.Items.Count-1;            }            //将当前索引指向下一曲            lboSongs.SelectedIndex = index;            musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex];            musicPlayer.Ctlcontrols.play();        }
八、多选删除歌曲的实现
private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)        {            //获取删除选中项的个数            int rmCount = lboSongs.SelectedItems.Count;            //必须先删除集合在删除列表,否则可能超出索引界限            for (int i = 0; i < rmCount; i++)            {                //先删集合                listSongsPaths.RemoveAt(lboSongs.SelectedIndex);                //再删列表                lboSongs.Items.RemoveAt(lboSongs.SelectedIndex);            }        } 
九、自动下一曲功能的实现

添加一个Time控件,Name:timerAutoNextSong,interval=1000(单位为ms,设置为1000表示每1s执行一次),tick事件的处理 

private void timerAutoNextSong_Tick(object sender, EventArgs e)        {            //音乐处于播放状态            if (musicPlayer.playState == WMPLib.WMPPlayState.wmppsPlaying)            {                //歌曲的总时间                double d1 = musicPlayer.currentMedia.duration;                //当期播放到的时间                double d2 = musicPlayer.Ctlcontrols.currentPosition;                if (d1 <= d2 + 1)                {                    //获取lboSongs的当前索引                    int index = lboSongs.SelectedIndex;                    //清空所有选中的索引项                    lboSongs.SelectedIndices.Clear();                    index++;                    if (index == lboSongs.Items.Count)                    {                        index = 0;                    }                    //将当前索引指向下一曲                    lboSongs.SelectedIndex = index;                    musicPlayer.URL = listSongsPaths[lboSongs.SelectedIndex];                    musicPlayer.Ctlcontrols.play();                }            }        }
十、歌词的实现

创建检测歌词的Timer控件,Name:TimerLrc,interval=1000

        List<double> lrcTime = new List<double>();//存储歌词的时刻集合        List<string> lrcText = new List<string>();//存储歌词对应时刻的内容        public void GetLrc(string FilePath)        {            //获取歌词的去路径            FilePath = FilePath.Substring(0, FilePath.IndexOf('.') + 1) + "lrc";            //歌词文件是否存在,不存在显示无法找到歌词            if (File.Exists(FilePath))            {                lrcTime.Clear();                lrcText.Clear();                //读取歌词文件中的每一行,结果放在allLinesLrc数组                string[] allLinesLrc = File.ReadAllLines(FilePath,Encoding.UTF8);                //去掉前两行的歌词,结果放在newAllLineLec数组                string[] newAllLineLrc=new string[allLinesLrc.Length-2];                int k=0;                for (int i = 2; i < allLinesLrc.Length; i++)                {                    newAllLineLrc[k] = allLinesLrc[i];                    k++;                }                //格式化歌词                for (int i = 0; i <newAllLineLrc.Length; i++)                {                    //temp1[0]00:48.79 temp1[1]歌词                    string[] temp1=newAllLineLrc[i].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);                    //temp2[0]00 temp2[1]48.79                    string[] temp2 = temp1[0].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);                    //时刻                   double time = double.Parse(temp2[0]) * 60 + double.Parse(temp2[1]);                    //将时刻和该时刻对应歌词分别存放到对应的集合中                    lrcTime.Add(time);                    lrcText.Add(temp1[1]);                                    }                        }            else             {                lblLrc.Text = "歌词未找到";            }        }
十一、音量的加减实现

private void btnAddVoice_Click(object sender, EventArgs e)        {            musicPlayer.settings.volume += 5;        }        private void btnMinus_Click(object sender, EventArgs e)        {            musicPlayer.settings.volume -= 5;        }    }
遗漏了一点,初始加载时播放和暂停按钮设置不可用,应该在播放列表的当前索引发生变化时设置为可用

private void lboSongs_SelectedIndexChanged(object sender, EventArgs e)        {            btnPlayOrPause.Enabled = true;        }
基本上差不多了,看效果微笑,最初的界面(略丑安静,小孩图片遮挡了WindowMediaPlayer组件安静


点击打开文件,找几首歌加进歌单

                           



                          

双击歌曲播放

           

歌词显示出来了-_-

总结:

           虽然东西丑了点,适合去理解C#语言的属性+时间+方法的概念,还是有点收获的!!!


0 0