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