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、イベントが呼び出されるたびに、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--;
        }
    }

注意:クラスは.wavファイルSoundPlayerのみを再生します。.mp3、.mpegなどの他のメディアファイルを再生したい場合は、代わりに使用してください。MediaPlayer

ありがとう、

これがお役に立てば幸いです:)

于 2012-10-15T00:13:30.663 に答える
2

EDIT-非同期ロードの使用を示すためのコードフラグメントの編集

このコードを試してください:

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を宣言すると、shuoldを使用したintメソッドが機能します。また、再生状態を追跡するために使用する変数は、クリックアクションごとに値が保持されるように、ハンドラーメソッドの外部に存在する必要があります。

于 2012-10-15T00:06:18.870 に答える