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

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

  1. 自定义css样式结合js控制audio做音乐播放器

    最近工作需求需要播放预览一些音乐资源,所以自己写了个控制audio的音乐播放器. 实现的原理主要是通过js调整audio的对象属性及对象方法来进行控制: 1.通过play().pause()来控制音乐 ...

  2. 用mciSendString做音乐播放器

    音乐操作类 public class clsMCI { public clsMCI() { // // TODO: 在此处添加构造函数逻辑 // } //定义API函数使用的字符串变量 [Marsha ...

  3. 抓某音乐播放器时现在多了个vkey,导致播放地址有问题,如何抓到vkey

    一:在已经通过axios和vue-cli本地服express通过地址获取到songmid这个参数 在js里面地址和参数如下: // 获取歌手和歌曲的详细信息 export function getSi ...

  4. vue——一个页面实现音乐播放器

    请忽略下面这段文字年关将至,时间好歹又多出了些许.却不敢过度消遣.岁月未曾饶过我,我亦不想饶过岁月.且将它塞得膨胀,让这一年看似加更充实.不曾料想我一个爱些风花雪月.研墨行歌之人,却做起了碼农这一行当 ...

  5. QT5:C++实现基于multimedia的音乐播放器(二)

    今天接着上一篇来实现播放器的槽函数. 先来实现播放模式,槽函数如下: //播放模式 void Music::musicPlayPattern() { //z=++z%3; ) { //顺序播放 pla ...

  6. 用PHP+H5+Boostrap做简单的音乐播放器(进阶版)

    前言:之前做了一个音乐播放器(纯前端),意外的受欢迎,然后有人建议我把后台一起做了,正好也想学习后台,所以学了两天php(不要吐槽我的速度,慢工出细活嘛~)然后在之前的基础上也又完善了一些功能,所以这 ...

  7. MediaPlayer音乐播放器、上一首、下一首、播放、停止、自动下一首、进度条

    本文介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用Med ...

  8. [ 原创 ]学习笔记-做一个Android音乐播放器是遇到的一些困难

    最近再做一个安卓的音乐播放器,是实验室里学长派的任务,我是在eclipse上进行开发的,由于没有android的基础,所以做起来困难重重. 首先是布局上的困难 1.layout里的控件属性不熟悉 2. ...

  9. Andriod小项目——在线音乐播放器

    转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...

随机推荐

  1. 判断字符串是否包含字母‘k’或者‘K’

    判断字符串是否包含字母‘k’或者‘K’ public bool IsIncludeK(string temp) { temp = temp.ToLower(); if (temp.Contains(' ...

  2. IIS安装错误导致网站访问不了

    如下图,网站正常但就是访问不了,原因是IIS配置不正确,把ASP.NET4.5等相关勾选上就可以了,不要用默认的勾选,要自己手动勾选.

  3. Winform下WebBrowser 编辑模式 监听键盘按键事件

    最近使用 WebBrowser 做了个富文本编辑器(其实网上有很多很多).例如下面这个玩意(不要在意界面神马的) WebBrowser在编辑模式下可以有一些HTML标签的功能,改变字体大小颜色等等等. ...

  4. Cassandra 计数器counter类型和它的限制

    文档基础 Cassandra 2.* CQL3.1 翻译多数来自这个文档 更新于2015年9月7日,最后有参考资料 作为Cassandra的一种类型之一,Counter类型算是限制最多的一个.Coun ...

  5. MinGW编译wxWidgets中的问题及解决方法

    其实网上wxWidgets编译相关的博文,都没写到关键点上,泛泛而谈——就写了执行几个命令,就万事大吉了! 维基百科上的这个页面讲解了编译中可能遇到的各种问题及解决办法.比较懒,不想翻译.wxWidg ...

  6. SequoiaDB(巨杉数据库)(社区版)安装配置使用图解

    SequoaiDB是一款新型企业级分布式非关系型数据库,提供了基于PC服务器的大规模集群数据平台.作为全球第一家企业级文档式 NoSQL分布式数据库,为用户提供了一个高扩展性.高可用性.高性能.易维护 ...

  7. phpMyAdmin安装

    phpMyAdmin是MySql的一个Web操作界面. phpMyAdmin官网貌似被和谐了,经常无法访问.不过我们可以从GitHub下载phpMyAdmin. 然后解压,搭建与普通的PHP网站一样. ...

  8. 通过URLHttpConnection方式连接网络步骤,获取位图为例

    要注意的是:访问网络不能直接放在主线程,要放在另外一个线程里面,如果放在主线程会报android.os.NetworkOnMainThreadException错误1 public Bitmap ge ...

  9. Express实现http和https服务

    一.介绍Http与Https 概念 HTTP: 超文本传输协议(Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文 ...

  10. iOS 第三方开源库----->AFNetworking

     AFNetworking AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库,它建立在URL 装载系统框架的顶层,内置在Cocoa里,扩展了强有力的高级网络抽象.它 ...