Музыка играет нестабильно с TrackBar - PullRequest
0 голосов
/ 01 ноября 2018

Я создаю простой музыкальный (mp3) плеер в WinForm на C #. Чего я хочу добиться:
1) Воспроизведение выбранного музыкального файла
2) Перемещение TrackBar автоматически при воспроизведении музыки
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;
}

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

1 Ответ

0 голосов
/ 01 ноября 2018

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

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

Переменная 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;
}
...