Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从两个不同的按钮播放和停止音频_C#_Naudio - Fatal编程技术网

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

C# 从两个不同的按钮播放和停止音频,c#,naudio,C#,Naudio,我正在运行暂停歌曲的代码,但它显然不起作用。 我无法从第二个按钮访问第一个按钮的变量,因此无法暂停歌曲。 你觉得我怎么能做到? 我使用naudio库是因为我想把音频文件作为资源 private void button3_Click(object sender, EventArgs e) { MemoryStream mp3file = new MemoryStream(Properties.Resources.musica1);

我正在运行暂停歌曲的代码,但它显然不起作用。 我无法从第二个按钮访问第一个按钮的变量,因此无法暂停歌曲。 你觉得我怎么能做到? 我使用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;
    }

您需要重新构造代码。问题是,在您的
按钮3\u Click
方法中,您正在加载并播放MP3,但随后该功能立即终止。
if
语句不会被持续检查,我想您会假设会发生这种情况。因此,单击
按钮2
只会更改
pausa
的状态,但这不会影响任何内容

一种方法是在类级别声明所有变量(
mp3file
mp3reader
waveOut
),然后将其余的代码放入
按钮3\u单击
中,比如说,放入表单的
加载
事件处理程序中

// 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\u单击
功能可以如下所示(假设
button3
是您的播放按钮,
button2
是您的暂停按钮):


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

您熟悉
Scope
吗?您不能从另一个方法之外访问一个方法中的局部变量。。这是这里的基本知识,是一个很好的方法,可供您使用和将来参考。。我建议您在更加熟练之前使用它| |在类级别将
pausa
声明为自动属性或公共属性。另外,
如果你要发布代码,发布所有相关代码,你在哪里声明pausa
我不熟悉var关键字,所以我刚刚复制了
var waveOut=new waveOut()并且我无法将其排除在方法之外。几天前我解决了这个问题,将waveOut声明为
waveOut,谢谢你:这是一个新手问题,很难^很简单
private void button3_Click(object sender, EventArgs e)
{
    waveOut.Play();
}

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