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培训、期待与您交流! ----------------------

  • 相关阅读:
    前端Vue项目——购物车页面
    vue组件通信传值——Vuex
    django+uwsgi+nginx 导出excel超时问题
    前端Vue项目——登录页面实现
    前端Vue项目——课程详情页面实现
    基于DFA算法、RegExp对象和vee-validate实现前端敏感词过滤
    python的小数据池
    VeeValidate——vue2.0表单验证插件
    前端Vue项目——首页/课程页面开发及Axios请求
    服务配置中心
  • 原文地址:https://www.cnblogs.com/qigang/p/3841943.html
Copyright © 2011-2022 走看看