14

1から9までの各キーが異なる音を出すサンプラープログラムを作っています。すべて正常に動作しますが、2つ(またはそれ以上)のサウンドを同時に押すと、2番目のサウンドが最初のサウンドを「強制終了」します。

を使用して、.WAVファイルのサウンドを再生していますSoundPlayer。どうすればこれを解決できますか?

4

6 に答える 6

7

複数のサウンドを同時に再生できるように設計されたDirectX(DirectSound)または同様のAPIを使用する必要があります。

于 2009-08-16T20:43:32.047 に答える
7

C# または VB.Net で一度に複数のサウンドを再生する簡単な方法が 1 つあります。mciSendString()各 .wav ファイルを再生するには、API 関数を呼び出す必要があります。ループ再生をしない限り、マルチスレッドを行う必要さえありません。を使用して作成されたクラスの完全な動作例を次に示しますMusicPlayermciSendString()

// Sound api functions
[DllImport("winmm.dll")]
static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);

上記の関数では、キーは最初のパラメーター コマンドです。別のコマンド名で 2 つの関数を呼び出す限り、それらは別々に/同時に再生されます。これは、C# プログラムの 1 つで行ったことです。

private void PlayWorker()
{
    StringBuilder sb = new StringBuilder();
    mciSendString("open \"" + FileName + "\" alias " + this.TrackName, sb, 0, IntPtr.Zero);
    mciSendString("play " + this.TrackName, sb, 0, IntPtr.Zero);
    IsBeingPlayed = true;
}

編集:実際の例へのリンクを追加しました。

于 2011-07-18T04:58:05.023 に答える
3
using System.Windows.Media

Function void Play(string audioPath)
{
MediaPlayer myPlayer = new MediaPlayer();
myPlayer.Open(new System.Uri(audioPath));
myPlayer.Play();
}

Play(Application.StartupPath + "\\Track1.wav");
Play(Application.StartupPath + "\\Track2.wav");

このコードは2 つのオーディオ ファイルを同時に再生できます。2 番目のオーディオの呼び出しはtrack2.wavの再生を妨げませんtrack1.wav

于 2016-06-27T08:35:15.440 に答える
3

あなたはこれを行うことができます:

SoundPlayerWAVストリームに対応。あなたは出来る

  • 「手で」演奏した MIX サンプルと、
  • 偽物 (どこかから WAV ヘッダーを取得します。複雑ではありません)。

そして、そのようなストリームをコンストラクターSoundPlayerパラメーターとして提供します。

そうすれば、やや複雑な DirectSound ライブラリを使用する必要がなくなり、ミキシング (一度に複数のサウンド) が可能になります。

于 2012-02-02T21:53:17.693 に答える
1

KeyPressイベント(または使用しているもの)で、WAVファイルへのパスを取得するコンストラクターを使用してSoundPlayerの新しいインスタンスを作成し、そのPlayメソッドを呼び出していると思います。理論的には、WindowsはWindows 98以降複数のWAVファイルを同時に再生できるため、これによって発生する「モノラル」効果が発生することはありません。聞いていると思います(このクラスの私自身の使用に基づく)これは、2番目のサウンドが開始したときの最初のサウンドのカットオフではありませんが、実際には、WAVファイルがディスクからロードされるときに全体的な再生が一時停止した結果として発生するグリッチです。

キーを押すたびにSoundPlayerの新しいインスタンスをロードする代わりに、クラススコープのSoundPlayerオブジェクトの配列を作成し、フォームのLoadイベントでディスクからそれらをプリロードしてみてください。次に、キーが押されたときに各SoundPlayerのPlayメソッドを呼び出すだけです。これで問題が解決する可能性がありますが、この方法でも時折グリッチが発生すると思います。

于 2009-08-16T21:03:45.010 に答える