从两个不同的按钮播放和停止音频

playing and stopping audio from two different buttons

我是 运行 这个用于暂停歌曲的代码,但它显然不起作用。 我无法从第二个按钮访问第一个按钮的变量,因此无法暂停歌曲。 你觉得我怎么做到的? 我正在使用 naudio 库,因为我想将音频文件作为资源。

private void button3_Click(object sender, EventArgs e)
{            
    MemoryStream mp3file = new MemoryStream(Properties.Resources.musica1);                
    Mp3FileReader mp3reader = new Mp3FileReader(mp3file);
    var waveOut = new WaveOut();
    waveOut.Init(mp3reader);
    waveOut.Play();

            if (pausa)
            {
                waveOut.Pause();
            }


    }
    private void button2_Click(object sender, EventArgs e)
    {
        pausa = true;
    }

您将需要重构您的代码。问题是,在您的 button3_Click 方法中,您正在加载和播放 MP3,但随后该功能立即终止。 if 语句不会被连续检查,这是我认为您假设会发生的情况。因此,单击 button2 只会更改 pausa 的状态,但这不会影响任何内容。

一种方法是将所有变量(mp3filemp3readerwaveOut)声明在 class 级别,然后将其余的将 button3_Click 中的代码写入表单的 Load 事件处理程序。

// These variables are declared at the class level
MemoryStream mp3file;
Mp3FileReader mp3reader;
WaveOut waveOut;

...

private void Form1_Load(object sender, EventArgs e)
{
    mp3file = new MemoryStream(Properties.Resources.musica1);                
    mp3reader = new Mp3FileReader(mp3file);
    waveOut = new WaveOut();
    waveOut.Init(mp3reader);    
}

现在,您的 buttonX_Click 函数看起来像这样(假设 button3 是您的播放按钮,button2 是您的暂停按钮):

private void button3_Click(object sender, EventArgs e)
{
    waveOut.Play();
}

private void button2_Click(object sender, EventArgs e)
{
    waveOut.Pause();
}

因为 waveOut 是在 class 级别声明的,所以两个按钮都可以访问它,因此可以随意播放和暂停。您不再需要 pausa,除非您当然需要知道程序其他地方的播放状态。