C# 音乐通过轨迹栏播放起伏

C# 音乐通过轨迹栏播放起伏,c#,winforms,trackbar,C#,Winforms,Trackbar,我正在用C#的WinForm创建一个简单的音乐(mp3)播放器。 我想要实现的是: 1)播放选定的音乐文件 2) 播放音乐时自动移动轨迹栏 3) 允许用户前后移动轨迹栏,以便他们可以从轨迹中的任何位置播放音乐。(音乐也在播放时) 我的1号和2号工作没有任何问题。但是,我在实施#3时遇到了困难。当我覆盖该值时,音乐播放非常不稳定。这是我的密码 private AxWMPLib.AxWindowsMediaPlayer player; /*Play the music file selected

我正在用C#的WinForm创建一个简单的音乐(mp3)播放器。 我想要实现的是:
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;
}

有谁能给我一些建议,告诉我如何在移动轨迹栏时播放音乐,而不让音乐变得波涛汹涌吗?

您面临的问题是,您正在从勾号事件中更新轨迹栏,然后触发播放器位置更新到它所在的位置。因此,每次勾号都会迫使轨迹栏更新两次,这会导致您的口吃

要修复此问题,如果勾号事件正在触发,则不需要更新玩家位置

类级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;
}

您面临的问题是,您正在从tick事件更新轨迹栏,然后这将触发玩家位置重新更新到其所在位置。因此,每次勾号都会迫使轨迹栏更新两次,这会导致您的口吃

要修复此问题,如果勾号事件正在触发,则不需要更新玩家位置

类级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;
}

这是因为
.Value
正在改变和调整播放机。对,我明白了,但我不知道我还能怎么做。。。顺便说一句,如果我删除最后一个方法,它工作良好,音乐播放流畅。没有波涛汹涌。但是如果我添加最后一个方法,它会变得不稳定。这是因为
.Value
正在改变和调整播放器。对,我知道了,但我不确定我还能怎么做。。。顺便说一句,如果我删除最后一个方法,它工作良好,音乐播放流畅。没有波涛汹涌。但是如果我加上最后一种方法,它会变得不稳定。非常感谢。它修好了!非常感谢你。它修好了!