Автоматическое воспроизведение следующего файла с помощью элемента управления MediaPlayer (AxWindowsMediaPlayer)

При изменении URL-адреса AxWindowsMediaPlayer в событии PlayStateChange воспроизведение не начинается автоматически, а просто переходит в состояние готовности.

У меня есть элемент управления AxWindowsMediaPlayer в моей программе C# WinForms. когда я обычно меняю свойство URL WindowsMediaPlayer1, он отлично работает и автоматически воспроизводит новый mp3-файл.

Когда песня закончилась, состояние WindowsMediaPlayer1 изменится на Stopped, и я хочу, чтобы следующее URL автоматически начало воспроизведение.

Я использовал событие PlayStatChange, поэтому, когда состояние игрока Stopped, URL изменится, но не воспроизводится автоматически!

Плеер переходит в состояние 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.
}

Любая помощь будет оценена по достоинству.


person Mohamad Hedayati    schedule 26.01.2016    source источник


Ответы (2)


Как указано в медиаплеере документация, вы не должны устанавливать Url из кода обработчика событий. Вместо этого вы можете воспроизвести следующий файл следующим образом:

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

Также в качестве другого варианта вы можете рассмотреть возможность использования плейлист.

person Reza Aghaei    schedule 26.01.2016

Я нашел это примечание на 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;
        }
    }
person Mohamad Hedayati    schedule 26.01.2016
comment
Вам не нужно использовать таймер, вы можете просто использовать this.BeginInvoke для установки URL-адреса. это то же самое, что изменить URL-адрес после этого события. - person Reza Aghaei; 26.01.2016