C#做音乐播放器时在自动下一曲中报异常的解决办法

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------


在利用Media Player做音乐播放器的时候,实现自动下一曲的功能是在PlayStateChange事件下,通过判断当前播放器的状态来实现。

首先需要在状态属性playState中的MediaEnded状态下,将下一曲的URL赋值给当前的mediaPlay,然后在playState中的Ready状态下调用MediaPlay的Ctlcontrols.play()方法,然后就可以实现自动播放下一曲的功能,但是遇到一个问题就是,在调用play()中报了一个异常,异常代码为:HRESULT:0xC00D1054。

解决办法:在这个状态下,先判断URL的值是否是当前歌曲列表中选定的项,也就是说判断在当前的MediaPlay中赋值的URL是否赋值成功。要求就是:要先改变界面上歌曲列表中的选择项,然后再为URL赋值,否则同样会报错。

贴上整个解决异常后整个PlayStateChange事件中的代码:

 

        #region 实现自动下一曲的功能
        //这个事件会和StatueChange事件存在一个线程之间的调度问题,这个事件没有执行完成,可能就会触发另外一个StatueChange事件,另外一个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];
            }
            //这个状态的判断必须要在上一个状态后面,因为需要在上一个状态中进行对URL赋值,同时,由于判断状态不一样,在事件的压栈上面处理的顺序也就不一样
            if (axMediaPlayer.playState == WMPLib.WMPPlayState.wmppsReady)
            {
                //加了这个判断的要求就是,在上一个MediaEnded中要先改变显示歌曲的listbox中的选择项,然后再对URL赋值,否则这个判断就不起作用
                if (axMediaPlayer.URL == listSong[listShowSong.SelectedIndex])
                {
                    try    //点击停止后再播放容易出问题,try一下就OK了
                    {
                         axMediaPlayer.Ctlcontrols.play();
                    }
                    catch(Exception ex)
                    {
                    }
                }
            }
            
        } 

        #endregion

 

上面代码中:axMediaPlayer是程序中MediaPlay组件的名称;listShowSong 是界面上用来显示歌曲列表的一个ListBox控件;listSong是程序后台中用来存放和界面上歌曲列表中歌曲名顺序相对应的URL的一个List<string>集合,里面的值和listShowSong 里面的值是一一对应关系。

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

 

posted on 2014-05-15 22:33  恋那片海  阅读(453)  评论(0编辑  收藏  举报