黑马程序员技术交流社区

标题: 音乐播放器问题 [打印本页]

作者: 袁晓俊    时间: 2014-5-16 10:06
标题: 音乐播放器问题
本帖最后由 袁晓俊 于 2014-5-16 11:12 编辑

出现下面的问题,求解决,,,,,不能自动播放下一首,,,

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 音乐播放器
{
    public partial class Form1 : Form
    {
        List<string> lSongs = new List<string>();//用于存放歌曲的数据库(核心)
        public Form1()
        {
            InitializeComponent();
        }
        private void AddURL_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
           if (ofd.ShowDialog() == DialogResult.OK)
           {
               axPlayer.URL = ofd.FileName;
               btnPlay.Enabled = true;
               btnStop.Enabled = true;
               btnMute.Enabled = true;
           }
        }   
        private void btnPlay_Click(object sender, EventArgs e)
        {
           // axPlayer.Ctlcontrols.play();
            if (btnPlay.Text == "播放")
            {
                axPlayer.Ctlcontrols.play();
                btnPlay.Text = "暂停";
            }
            else if (btnPlay.Text == "暂停")
            {
                axPlayer.Ctlcontrols.pause();
                btnPlay.Text = "播放";
            }
        }
        //停止
        private void btnStop_Click(object sender, EventArgs e)
        {
            axPlayer.Ctlcontrols.stop();
            btnPlay.Text = "播放";
        }  
      
        //静音、取消静音
        private void btnMute_Click(object sender, EventArgs e)
        {
            if (btnMute.Text == "静音")
            {
                axPlayer.settings.mute = true;
                btnMute.Text = "取消静音";
            }
            else if (btnMute.Text == "取消静音")
            {
                axPlayer.settings.mute = false;
                btnMute.Text = "静音";
            }
        }
       //打开部分文件
        private void btnOpen_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.InitialDirectory = @"E:\KuGou";//定义默认的文件路径
            ofd.Filter = "音乐文件|*.mp3;*.wma";//定义只查找的文件类型
            ofd.Title = "请选择文件";//对话框的窗体标示
            ofd.Multiselect = true;//文件可以多个选择
            if (ofd.ShowDialog() == DialogResult.OK)//如果打开成功
            {
                btnPrav.Enabled = true;
                btnPlay.Enabled = true;
                btnMute.Enabled = true;
                btnStop.Enabled = true;
                //listSongsPlayer.Items.AddRange(ofd.FileNames);
                //axPlayer.URL = listSongsPlayer.Items[1].ToString();
                for (int i = 0; i < ofd.FileNames.Length; i++)//遍历文件的文件名
                {
                    lSongs.Add(ofd.FileNames);
                    string[] temp = ofd.FileNames.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
                    listSongsPlayer.Items.Add(temp[temp.Length - 1]);
               
                }
                MyPlay();//默认播放第0shou
            }
        }
        //播放索引
        private void MyPlay(int i)
        {
            axPlayer.URL = lSongs;
            axPlayer.Ctlcontrols.play();
            listSongsPlayer.SelectedIndex = i;
            btnPlay.Text = "暂停";

        }
        //播放方法,后台列表选择和播放前台选项高亮显示
        private void MyPlay()
        {
            MyPlay(0);
        }
        private void btnNext_Click(object sender, EventArgs e)
        {
            
            if(listSongsPlayer.Items.Count>0)
            MyPlay(listSongsPlayer.SelectedIndex + 1 > lSongs.Count - 1 ? 0 : ++listSongsPlayer.SelectedIndex);
        }
      
        private void btnPrav_Click(object sender, EventArgs e)
        {
            if(listSongsPlayer.Items.Count>0)
            MyPlay(listSongsPlayer.SelectedIndex - 1 < 0 ? lSongs.Count - 1 : --listSongsPlayer.SelectedIndex);
            
        }
        //双击播放
        private void listSongsPlayer_DoubleClick(object sender, EventArgs e)
        {
            MyPlay(listSongsPlayer.SelectedIndex);
        }
        //右击删除
        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (listSongsPlayer.SelectedIndex !=-1)
            {
                lSongs.RemoveAt(listSongsPlayer.SelectedIndex);
                listSongsPlayer.Items.RemoveAt(listSongsPlayer.SelectedIndex);
            }

        }
        //清空播放列表
        private void clearToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lSongs.Clear();
            listSongsPlayer.Items.Clear();
        }

        private void axPlayer_PlayStateChange_1(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {
            int temp = 0;
            if(lSongs.Count==0)
            {
                return;
            }
            if (axPlayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
            {
              temp = listSongsPlayer.SelectedIndex;
                temp++;
                if (temp > lSongs.Count - 1)
                {
                    listSongsPlayer.SelectedIndex = 0;
                    axPlayer.URL = lSongs[0];
                }
                else
                {
                    listSongsPlayer.SelectedIndex = temp;
                    axPlayer.URL = lSongs[temp];

                }


            }
          if (axPlayer.playState == WMPLib.WMPPlayState.wmppsReady)
          {
          axPlayer.Ctlcontrols.play();
         }

            
        }

    }
}

异常.jpg (117.52 KB, 下载次数: 36)

异常.jpg

作者: 方杰斌    时间: 2014-5-16 10:27
  第三个人   遇到同样的问题了。



这个 是线程调度问题。
=============================================
#region 实现自动下一曲的功能
        //这个事件和StatueChange事件存在一个线程之间的调度问题,一个事件没有执行完成,后触发另外一个事件,另外一个事件中又会触发这个事件,结果就是有一个事件队列和事件压栈,可以通过单步调试来看看执行过程
        /// <summary>
        /// 实现自动下一曲的功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        ///
        private void axMediaPlayer_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {
            //在正常播放的时候,播放完成的状态,这个状态后,会重新读取媒体文件,此时重新赋值URL,但是这这个状态下调用播放是不起作用的
            if (listSong.Count < 0)
            {
                return;
            }
            
            if (axMediaPlayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
            {
                //int index = listShowSong.SelectedIndex;
                //index++;
                //if (index > listSong.Count - 1)
                //{
                //    listShowSong.SelectedIndex = 0;
                //    axMediaPlayer.URL = listSong[0];
                //}
                //else
                //{
                //  先改变选择项,后进行赋值
                //    listShowSong.SelectedIndex = index;
                //    axMediaPlayer.URL = listSong[index];
                //}
                //简写代码:
                axMediaPlayer.URL=listSong[ listShowSong.SelectedIndex + 1 > listSong.Count - 1 ? listShowSong.SelectedIndex = 0 : ++listShowSong.SelectedIndex];
            }
            //这个状态的判断必须要在上一个状态MediaEnded后面,因为需要在上一个状态中进行对URL赋值,同时,由于判断状态不一样,在事件的压栈上面处理的顺序也就不一样
            if (axMediaPlayer.playState == WMPLib.WMPPlayState.wmppsReady)
            {
                //添加下面这个判断的要求就是,在上一个MediaEnded中要先改变显示歌曲的listbox中的选择项,然后再对URL赋值,否则这个判断就不起作用。如果不添加这个判断,就会出现上面的错误
                if (axMediaPlayer.URL == listSong[listShowSong.SelectedIndex])
                {
                    axMediaPlayer.Ctlcontrols.play();
                }
            }
            
        }

        #endregion

上面代码中,axMediaPlayer是系统中的mediaplayer,listShowSong是界面上用来显示歌曲列表的listbox,listSong是后台中用来存放,对应于界面上歌曲列表的URL值



详细 参考  http://bbs.itheima.com/thread-118097-1-1.html
作者: 袁晓俊    时间: 2014-5-16 10:42
感谢感谢,,,,,,,,,
作者: 嘴角上揚ぃ读不    时间: 2014-5-16 10:47
我也是遇到你这个问题了。纠结
作者: 袁晓俊    时间: 2014-5-16 10:50
是不是进程同步的问题啊?
作者: 袁晓俊    时间: 2014-5-16 11:14
方杰斌 发表于 2014-5-16 10:27
第三个人   遇到同样的问题了。

按照你的建议写了,但是,当再一次再添加列表歌曲的时候出现下面的错误,,,又该如何修改?

1111111111111111.jpg (160.09 KB, 下载次数: 53)

1111111111111111.jpg

作者: 方杰斌    时间: 2014-5-16 12:42
袁晓俊 发表于 2014-5-16 11:14
按照你的建议写了,但是,当再一次再添加列表歌曲的时候出现下面的错误,,,又该如何修改?

...

详细 参考  http://bbs.itheima.com/thread-83413-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2