Mp3播放类播放列表中的歌曲,但等到一个完成后再继续

时间:2012-07-14 22:47:51

标签: c# winforms multithreading datagridview thread-sleep

我目前正在使用c#和winforms播放mp3文件tutorial,但我添加了一个datagridview来列出歌曲,现在当我点击网格中的一首歌时它播放的歌曲就好了但是它只播放那首歌,我想做的就是一旦完成歌曲播放就转到列表中的下一首歌。我已经尝试了Thread.Sleep和audiolenght作为时间,但这只是停止整个应用程序工作,直到睡眠完成,这根本不是我想要的,我是winforms的新手,所以如果有人可以引导我到我需要改变的地方让它发挥作用我真的很感激。这是我到目前为止的代码:

private void dgvTracks_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        PlayFiles(e.RowIndex);
    }
    public void PlayFiles(int index)
    {
        try
        {
            int eof = dgvTracks.Rows.Count;
            for (int i = index; index <= eof; i++)
            {
                if (File.Exists(dsStore.Tables["Track"].Rows[i]["Filepath"].ToString()))
                {
                    PlayFile(dsStore.Tables["Track"].Rows[i]["Filepath"].ToString());
                    Application.DoEvents();
                    Thread.Sleep(TimeSpan.FromSeconds(mplayer.AudioLength));
                }
                else
                {
                    Exception a = new Exception("File doesn't exists");
                    throw a;
                }

            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, ex.Message, MessageBoxButtons.OK);
        }
    }
    public void PlayFile(string filename)
    {
        mplayer.Open(filename);
        mplayer.Play();
    }

2 个答案:

答案 0 :(得分:1)

我假设mplayerSystem.Windows.Media.MediaPlayer的实例。

您可以订阅MediaPlayer.MediaEnded事件,并使用事件处理程序开始播放下一个文件。您需要将当前正在播放的索引存储在某处。

...

int currentPlayIndex = -1;

...

mplayer.MediaEnded += OnMediaEnded;

...

private void OnMediaEnded(object sender, EventArgs args)
{
    // if we want to continue playing...
    PlayNextFile();
}

...

public void PlayNextFile()
{
    PlayFiles(currentPlayIndex + 1);
}

public void PlayFiles(int index)  
{  
    try  
    {  
        currentPlayIndex = -1;

        int eof = dgvTracks.Rows.Count;  
        for (int i = index; index <= eof; i++)  
        {  
            if (File.Exists(dsStore.Tables["Track"].Rows[i]["Filepath"].ToString()))  
            {  
                currentPlayIndex = i;  // <--- save index

                PlayFile(dsStore.Tables["Track"].Rows[i]["Filepath"].ToString());  
                Application.DoEvents();  
                Thread.Sleep(TimeSpan.FromSeconds(mplayer.AudioLength));  
            }  
            else  
            {  
                Exception a = new Exception("File doesn't exists");  
                throw a;  
            }  
        }  
    }  
    catch (Exception ex)  
    {  
        MessageBox.Show(ex.Message, ex.Message, MessageBoxButtons.OK);  
    }  
}  

答案 1 :(得分:0)

在播放新音频之前,

StopClose之前正在播放。例如,如果您使用MediaPlayer.Play

using System.Windows.Media;

MediaPlayer mplayer = new MediaPlayer();

public void PlayFile(string filename)
{
    mplayer.Stop();
    mplayer.Close();
    mplayer.Open(filename);
    mplayer.Play();
}