Музыка играет прерывисто с TrackBar

Я создаю простой музыкальный (mp3) плеер в WinForm на С#. Чего я хочу добиться, так это:
1) Воспроизвести выбранный музыкальный файл
2) Автоматически перемещать трекбар во время воспроизведения музыки
3) Разрешить пользователю перемещать трекбар вперед и назад, чтобы они могли играть музыку из любой точки трека. (При этом играет музыка)

У меня №1 и №2 работают без проблем. Однако у меня возникли трудности с реализацией № 3. Музыка играет очень прерывисто, так как я перезаписываю значение. Вот мой код.

private AxWMPLib.AxWindowsMediaPlayer player;

/*Play the music file selected (#1) */
private void BtnPlay_Click(object sender, EventArgs e)
{
    player = new AxWMPLib.AxWindowsMediaPlayer();
    player.CreateControl();
    player.URL = filePath; //Initialized somewhere in the code
    player.PlayStateChange += player_PlayStateChange;
    player.Ctlcontrols.play();
}

private void player_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
    if (player.playState == WMPLib.WMPPlayState.wmppsPlaying)
    {
        MyTrackBar.Maximum = (int)player.Ctlcontrols.currentItem.duration;
        TmrPlay.Start();
    }
    else if(player.playState == WMPLib.WMPPlayState.wmppsStopped)
    {
        TmrPlay.Stop();
        MyTrackBar.Value = 0;
    }
}

/*Move the TrackBar automatically with Timer. (#2) Runs every 100 ms */
private void TmrPlay_Tick(object sender, EventArgs e)
{
    if (player.playState == WMPLib.WMPPlayState.wmppsPlaying)         
        MyTrackBar.Value = (int)player.Ctlcontrols.currentPosition;
}

/* Trying to play music from anywhere when the TrackBar is manually moved. 
   For example, they can move the TrackBar and move it towards the end of the 
   music, WHILE THE MUSIC IS PLAYING. */
/* With this below event code, I can move the TrackBar freely, but the music
   plays very choppy because it keeps changing the currentPosition. */
private void MyTrackBar_ValueChanged(object sender, EventArgs e)
{
    player.Ctlcontrols.currentPosition = MyTrackBar.Value;
}

Может ли кто-нибудь дать мне совет о том, как воспроизводить музыку без рывков при перемещении трекбара?


person Jessica.D    schedule 01.11.2018    source источник
comment
это потому, что .Value меняет и настраивает игрока.   -  person Daniel A. White    schedule 01.11.2018
comment
Да, я понимаю это, но я не уверен, как еще я могу это сделать... Кстати, если я уберу последний метод, он будет работать нормально, и музыка будет воспроизводиться плавно. Нет прерывистого. Но если я добавлю последний метод, он станет прерывистым.   -  person Jessica.D    schedule 01.11.2018


Ответы (1)


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

Чтобы исправить это, вам нужно не обновлять позицию игрока, если срабатывает событие тика.

Переменная bool на уровне класса сделает свое дело:

private bool ticking = false;

В вашем TmrPlay_Tick вы должны установить ticking в true:

if (player.playState == WMPLib.WMPPlayState.wmppsPlaying)         
{
    ticking = true;
    MyTrackBar.Value = (int)player.Ctlcontrols.currentPosition;
}

Затем в вашем событии MyTrackBar_ValueChanged не обновляйте трекбар снова, если отметка верна:

if (ticking)
{
    ticking = false;
}
else
{
    player.Ctlcontrols.currentposition = MyTrackBar.Value;
}
person Handbag Crab    schedule 01.11.2018
comment
Спасибо большое. Это было исправлено! - person Jessica.D; 02.11.2018