zoukankan      html  css  js  c++  java
  • 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培训、期待与您交流! ----------------------

  • 相关阅读:
    hdu 1042 N!
    hdu 1002 A + B Problem II
    c++大数模板
    hdu 1004 Let the Balloon Rise
    hdu 4027 Can you answer these queries?
    poj 2823 Sliding Window
    hdu 3074 Multiply game
    hdu 1394 Minimum Inversion Number
    hdu 5199 Gunner
    九度oj 1521 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/qigang/p/3841943.html
Copyright © 2011-2022 走看看