5

在 PlayStateChange 事件中更改 AxWindowsMediaPlayer URL 时,它不会自动开始播放,只会更改为“Ready”状态。

我的 C# WinForms 程序中有一个“AxWindowsMediaPlayer”控件。当我通常更改URLWindowsMediaPlayer1 的属性时,它可以正常工作并自动播放新的 mp3 文件。

当歌曲结束时,WindowsMediaPlayer1 的状态变为StoppedI Want 下一个URL自动开始播放。

我使用PlayStatChange了事件,所以当播放器状态为 时StoppedURL会改变,但不会自动播放!

播放器进入Ready状态,直到我按下 WindowsMediaPlayer1 上的播放按钮。

这是代码:

private void Form1_Load(object sender, EventArgs e)
{
    WindowsMediaPlayer1.URL = "6.mp3"; //Works fine      
}
private void button1_Click(object sender, EventArgs e)
{
    WindowsMediaPlayer1.URL = "4.mp3"; //Works fine. It changes the music.
}
private void WindowsMediaPlayer1_PlayStateChange(object sender, 
    AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
    if (e.newState == 1) //1 is for "Stopped" State
        WindowsMediaPlayer1.URL = "5.mp3"; 
    // Here is the problem. 
    // URL Will change but player goes to "Ready" State 
    // But not in "playing" until I press the play button in control.
}

任何帮助,将不胜感激。

4

2 回答 2

7

如媒体播放器文档中所述,您不应设置Urlfrom 事件处理程序代码。相反,您可以通过这种方式播放下一个文件:

private void axWindowsMediaPlayer1_PlayStateChange(object sender, 
    AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
    if (e.newState == 1) 
    {
        this.BeginInvoke(new Action(() => {
            this.axWindowsMediaPlayer1.URL = @"address of nextfile";
        }));
    }   
}

作为另一种选择,您可以考虑使用播放列表

于 2016-01-26T14:40:37.927 回答
0

我在msdn上找到了有关 player.URL 的注释:

“不要从事件处理程序代码调用此方法。从事件处理程序调用 URL 可能会产生意外结果。”

所以我尝试了另一种方法来解决它并且它的工作。

添加了一个计时器和一个布尔变量来检查 WindowsMediaPlayer1 是否“已停止”

这是解决方案:

 public partial class Form1 : Form
{
    bool nextURL = false;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        WindowsMediaPlayer1.URL = "5.mp3";                   
    }

    private void WindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
        if (e.newState == 1) // 1 is consider for  "Stopped" State
        {
            nextURL = true;   // if the song ended "nextURL" flag sets to true
        }   
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (nextURL)
        {
            WindowsMediaPlayer1.URL = "6.mp3";
            nextURL = false;
        }
    }
于 2016-01-26T14:19:55.120 回答