首页 新闻 会员 周边

C#的COM组件WMP(Windows Media Player)的控制

0
悬赏园豆:100 [已解决问题] 解决于 2013-04-16 00:23

由于我要实现在后台通过代码控制播放器何时播放,何时等待播放,所以用到了这个控件,可是当我在用Theard.Sleep()方法让进程睡眠之后,再播放下一首音乐的时候就起不到作用了。

不知道是什么原因?想了好久也没想到解决的办法,还请各们高手解决疑问。

Lyken的主页 Lyken | 初学一级 | 园豆:112
提问于:2013-04-05 21:28
< >
分享
最佳答案
0

为什么要Sleep()。WMP不是有提供暂停功能吗?

收获园豆:100
滴答的雨 | 老鸟四级 |园豆:3660 | 2013-04-06 00:28

可是我暂停后,如果想过几秒让下一首播放,怎么播放呢?

Lyken | 园豆:112 (初学一级) | 2013-04-06 13:09
            System.Threading.Thread.Sleep(2000);
            this.axWindowsMediaPlayer1.URL = @"C:\Users\LinmoXK\Documents\Leve12\Topic-1\单词发音_1_Topic_1_Level_12.wav";  
            this.axWindowsMediaPlayer1.Ctlcontrols.play();
            System.Threading.Thread.Sleep(2000);
            MessageBox.Show("sss");
            this.axWindowsMediaPlayer1.URL = @"C:\Users\LinmoXK\Documents\Leve12\Topic-1\单词发音_2_Topic_1_Level_12.wav";
            this.axWindowsMediaPlayer1.Ctlcontrols.play();            
Lyken | 园豆:112 (初学一级) | 2013-04-06 13:37

@Linmo: 有这种事,你调试跟代码有执行你播放的代码吗?

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-04-06 13:38

如上述代码,如果把MessageBox.Show()去掉,就只会执行第二个语音,但是添加上就会从第一个播放,这是什么原因?

Lyken | 园豆:112 (初学一级) | 2013-04-06 13:39

@Linmo: MEssageBox会阻断消息传递、阻断代码继续执行。当show出来后,WMP这时已经开始play第一个语音,由硬件支持播放。如果不show,那么第二个语音会覆盖掉第一个语音吧。。。你想让线程休息可以使用Thread.SpinWait()..

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-04-06 13:45

@滴答的雨: 用Thread.SpinWait()也会把第一个覆盖掉的

Lyken | 园豆:112 (初学一级) | 2013-04-06 15:28

@Linmo: 我看出来了,这个代码是执行完毕之后,才会让palyer播放,不是边播放边执行。可是如果我的播放列表中有好多音乐,可是我又想在上一个音乐播放完之后暂停2s之后接着播放下一个,这个要怎么实现?

Lyken | 园豆:112 (初学一级) | 2013-04-06 15:39

@Linmo:

1、使用Thread.sleep(2000)

2、监听你的音乐合适播放完。你也可以这样

private void wmp_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
          //如果已播放完毕就播放下一个文件
          if ((WMPLib.WMPPlayState)e.newState == WMPLib.WMPPlayState.wmppsReady) wmp.Ctlcontrols.play();
}  

判断切换音乐后,Pause()+Thread.sleep(2000)

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-04-06 16:25
        private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {
            if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
            {
                //MessageBox.Show("释放1111");
                axWindowsMediaPlayer1.Ctlcontrols.pause();
                //System.Threading.Thread.Sleep(2000);
            }
            //}
            //if ((WMPLib.WMPPlayState)e.newState == WMPLib.WMPPlayState.wmppsStopped)
            //    System.Threading.Thread.Sleep(3000);
            //    //MessageBox.Show("暂停了");
            //    axWindowsMediaPlayer1.Ctlcontrols.play();
        }

 

@滴答的雨: 我入的音频文件都是3秒以内的,在加载的时候,都加载到了播放列表里,上网查了半天没找到怎么把那个自动播放和自动循环关掉,还有,我按你写的还是不行,但我改了一下,如果写成下面这样就有点效果

if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
{
//axWindowsMediaPlayer1.Ctlcontrols.pause();
System.Threading.Thread.Sleep(2000);
}

在这里面用pause()是控制不了的。这样虽然有效果,但却是不是每一个都睡2秒,而是每两个,不知道是不是我的音频文件太短的原因

Lyken | 园豆:112 (初学一级) | 2013-04-06 18:45

@滴答的雨: 

settings.autoStart=false;也关不了自动播放,什么原因啊?

Lyken | 园豆:112 (初学一级) | 2013-04-06 18:47

@Linmo: 这个不懂,也许跟播放模式有关,你看看有没有播放单曲的选项吧

//顺序播放
wmp.settings.setMode("shuffle", False)
//随机播放
wmp.settings.setMode("shuffle", True)
//循环播放
wmp.settings.setMode("loop", True)

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-04-06 20:33
其他回答(1)
0

大神,能问下,那个全屏怎么控制吗?为什么写了全屏之后不起作用呢?

_Vegetables | 园豆:586 (小虾三级) | 2015-04-15 08:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册