从两个不同的按钮播放和停止音频
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
的状态,但这不会影响任何内容。
一种方法是将所有变量(mp3file
、mp3reader
和 waveOut
)声明在 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
,除非您当然需要知道程序其他地方的播放状态。
我是 运行 这个用于暂停歌曲的代码,但它显然不起作用。 我无法从第二个按钮访问第一个按钮的变量,因此无法暂停歌曲。 你觉得我怎么做到的? 我正在使用 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
的状态,但这不会影响任何内容。
一种方法是将所有变量(mp3file
、mp3reader
和 waveOut
)声明在 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
,除非您当然需要知道程序其他地方的播放状态。