我正在创建一个简单的音乐(mp3)播放器在WinForm in C#。我想要实现的是:
1)播放选定的音乐文件
2)在音乐播放时自动移动TrackBar
3)允许用户来回移动轨迹栏,这样他们就可以在轨道上的任何地方播放音乐。(音乐也在播放)
我的第一和第二工作没有任何问题。然而,我在实现#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;
}有人能给我一些建议吗?当TrackBar被移动的时候,如何不让音乐变得波涛汹涌?
发布于 2018-11-01 20:45:05
您面临的问题是,您正在更新跟踪条从滴答事件,然后这是触发球员的位置被重新更新到它的位置。因此,每个滴答迫使跟踪条更新两次,这是介绍你正在经历的口吃。
要修复它,您需要不更新球员的位置,如果勾选事件是触发。
类级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;
}https://stackoverflow.com/questions/53108193
复制相似问题