2 u010919511 u010919511 于 2013.06.02 09:57 提问

参考网上代码写的C#音乐播放器,无法实现自动播放下一首歌,求助!

全部代码太长,只把自动播放部分的代码贴出来:
private void timer1_Tick(object sender, EventArgs e)
{
// 用Timer控件控制连续播放
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
{
if (playOne == false)
{
if (selectOne < listBox1.Items.Count)
{
selectOne += 1;
}
else if (selectOne == listBox1.Items.Count)
{
// 如果列表中所有媒体文件都播放完毕,则从头开始。
selectOne = 1;
}
}
listBox1.SelectedIndex = selectOne - 1;
Play(selectOne);
}
上述代码中selectOne表示正在播放的曲目的编号,playOne表示是否单曲循环。

我怀疑这个timer没有被触发,触发timer的代码如下:
private void button4_Click(object sender, EventArgs e)
{
if (listBox1.SelectedIndex < 0) //当前没有在播放列表中选定任何文件时,从播放列表的第一个文件开始播放
{
selectOne = 1;
listBox1.SelectedIndex = 0;
}
else
{
selectOne = listBox1.SelectedIndex + 1;
}
Play(selectOne);
this.Invoke(new MethodInvoker(timer1.Start)); //触发timer,写成 //timer1.Enabled= true也不行
button7.Enabled = true;
button8.Enabled = true;
button9.Enabled = true;

4个回答

gh18789417141
gh18789417141   2015.03.12 10:31

给你说下思路自己参考下

gh18789417141
gh18789417141   2015.03.12 10:37

实现自动播放一般是有2种思路:(1)根据时间差来自动播放下一曲。比如一首歌曲的时间时02:20.4,实际上在这个时间还没有完全播放完时就停止播放,总是差个零点几秒的。(2)第二种是根据播放器的状态实现自动播放下一曲。播放器的状态Ready Playing Pause Ended Stop,当到达Ended,并且在Ready之后就会实现自动播放下一曲。下面分别粘贴下代码,不喜勿喷。

gh18789417141
gh18789417141   2015.03.12 10:41

(1),根据时间差播放下一曲。
if (musicPlayer.currentMedia.duration - musicPlayer.Ctlcontrols.currentPosition <= 1)
{
int index = listBox1.SelectedIndex;//获得当前选中项的所有
listBox1.SelectedIndices.Clear(); //将之前选中项清空
if (index == -1)
{
return;
}
index++;
if (index == listBox1.Items.Count)//最后一首歌
{
index = 0;
}
//将改变后的索引重新赋值给当前选中项
listBox1.SelectedIndex = index;
//通过index在集合中拿到全路径,赋值给播放器的URL属性
musicPlayer.URL = listSong[index];
musicPlayer.Ctlcontrols.play();
}

 (2)根据播放状态播放下一曲。在WindowsMediaPlayer的PlayStateChange事件中添加以下代码:
 //当播放器的播放状态发生改变时,判断播放状态是否到达Ended,如果是,进行下一曲
            if (musicPlayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
            {
                int index = listBox1.SelectedIndex;//获得当前选中项的所有
                listBox1.SelectedIndices.Clear(); //将之前选中项清空
                if (index == -1)
                {
                    return;
                }
                index++;
                if (index == listBox1.Items.Count)//最后一首歌
                {
                    index = 0;
                }
                //将改变后的索引重新赋值给当前选中项
                listBox1.SelectedIndex = index;
                //通过index在集合中拿到全路径,赋值给播放器的URL属性
                musicPlayer.URL = listSong[index];                
            }
            if (musicPlayer.playState == WMPLib.WMPPlayState.wmppsReady)
            {
                //播放器自动的小bug
                try
                {
                    musicPlayer.Ctlcontrols.play();
                }
                catch (Exception ex)
                { }
            }







QTQ_2015
QTQ_2015   2016.03.27 10:23

楼主,是你那个if (musicPlayer.currentMedia.duration - musicPlayer.Ctlcontrols.currentPosition <= 1)语句的大括号要包括全部

Csdn user default icon
上传中...
上传图片
插入图片