4

我正在尝试创建自己的小音板来播放 WAV 文件。现在播放不是问题,但如果需要,我想要一种停止播放的方法。我想到了一个停止按钮,但不知道如何使它起作用。所以我想到了使用循环,但它似乎不起作用。只是想知道是否有人可以帮助我在哪里出错,或者这只是一种失败的方法,那么如果你能告诉我一个更好的方法,那就太好了。:)

    private void button1Sound(object sender, MouseEventArgs e)
    {
        int i = 0;
        SoundPlayer simpleSound = new SoundPlayer(@"file.wav");

        while (i == 0)
        {
            simpleSound.Play();
            i++;
        }

        if (i >= 1)
        {
            simpleSound.Stop();
        }
    }

我也想过只做一个 ELSE IF 但这也没有用。我试过了:

    private void button1Sound(object sender, MouseEventArgs e)
    {
        int i = 0;
        SoundPlayer simpleSound = new SoundPlayer(@"file.wav");

        if (i == 0)
        {
            simpleSound.Play();
            i++;
        }
        else if (i > 1)
        {
            simpleSound.Stop();
        }
    }
4

2 回答 2

3

因为您已int i = 0在 void 内添加,所以每次调用事件时,i将始终为0。所以最好包括i在虚空之外。

 int i = 0;
 SoundPlayer simpleSound = new SoundPlayer(@"file.wav"); //Thanks to @Wanabrutbeer

 private void button1Sound(object sender, MouseEventArgs e)
    {


        if (i == 0)
        {
            simpleSound.Play();
            i++;
        }

       else if (i >= 1)
        {
            simpleSound.Stop();
            i--;
        }
    }

注意:该课程SoundPlayer仅播放.wav文件。如果您想播放其他媒体文件,如.mp3、.mpeg 等...MediaPlayer改用。

谢谢,

我希望这有帮助 :)

于 2012-10-15T00:13:30.663 回答
2

编辑 - 编辑代码片段以显示异步加载的使用

试试这个代码:

private System.Media.SoundPlayer sound;
private bool isPlaying = false;
private System.Drawing.Image playimage = System.Drawing.Image.FromFile(@"playimage");
private System.Drawing.Image stopimage = System.Drawing.Image.FromFile(@"stopimage");

private void playstopbutton_Click(object sender, EventArgs e)
{
    Button btn = (sender as Button);
    if (isPlaying)
    {
        sound.Stop();
        isPlaying = false;
        btn.Text = "Play";
        btn.Image = playimage;
    }
    else if (sound.IsLoadCompleted)
    {
        sound.Play();
        isPlaying = true;
        btn.Text = "Stop";
        btn.Image = stopimage;
    }
    else
    {
        btn.Enabled = false;
        if (sound == null) sound = new System.Media.SoundPlayer(@"wavefile");
        sound.LoadCompleted += new AsyncCompletedEventHandler(sound_LoadCompleted);
        sound.LoadAsync();
    }
}

private void sound_LoadCompleted(object sender, AsyncCompletedEventArgs e)
{
    this.playstopbutton.Text = "Stop";
    this.playstopbutton.Image = playimage;
    this.playstopbutton.Enabled = true;
    isPlaying = true;
    sound.Play();
}

您可能遇到的问题是您的声音范围仅在方法内部,它需要是类范围,以便每次处理相同的实例声音。从技术上讲,如果您在点击处理程序之外声明 SoundPlayer,您使用的 int 方法应该可以工作。此外,您用于跟踪播放状态的任何变量都需要存在于处理程序方法之外,以便该值在每个单击操作上都保持不变。

于 2012-10-15T00:06:18.870 回答