web-dev-qa-db-ja.com

2つの音を同時に再生する

2つのサウンドを同時に再生する方法はありますか?

SoundPlayerがこれを実行できないことを知っています。 SoundEffectはXNAの一部にすぎないと思われるため、使用できません。

必要な2つのサウンドは、未知のランダムな時間に呼び出されます。サウンドは、再生後に制御する必要があります。つまり、再生が終了する前にサウンドを停止できる必要があります。

29
AlanFoster

PresentationCoreおよびWindowsBaseを参照して、これを試してください...

var p1 = new System.Windows.Media.MediaPlayer();
p1.Open(new System.Uri(@"C:\windows\media\tada.wav"));
p1.Play();

// this sleep is here just so you can distinguish the two sounds playing simultaneously
System.Threading.Thread.Sleep(500);

var p2 = new System.Windows.Media.MediaPlayer();
p2.Open(new System.Uri(@"C:\windows\media\tada.wav"));
p2.Play();

[〜#〜] edit [〜#〜]一見すると、最初の後に2番目のサウンドを再生するように見えるので、おそらく反対票を受け取りました終了しました。そうではありません。ウィンドウによって非同期で再生されます。スリープはそこにあるので、このコードを逐語的にテストすると、サウンドが一緒に再生されるのを聞くことができますが、同じサウンドであるため、遅延がなければ目立たなくなります。

このコードは、2つのサウンドを別々のスレッドで重ねて再生する方法を示しています。これは、再生がいずれにしてもブロックされないため、無意味です。

new System.Threading.Thread(() => {
        var c = new System.Windows.Media.MediaPlayer();
        c.Open(new System.Uri(@"C:\windows\media\tada.wav"));
        c.Play();
    }).Start();

System.Threading.Thread.Sleep(500);

new System.Threading.Thread(() => {
        var c = new System.Windows.Media.MediaPlayer();
        c.Open(new System.Uri(@"C:\windows\media\tada.wav"));
        c.Play();
    }).Start();

http://msdn.Microsoft.com/en-us/library/system.windows.media.mediaplayer.stop.aspx クラスには、再生を停止するために必要なコントロールもあります

31
JeremyWeir

「MediaPlayer」オブジェクトでは、2つのインスタンスを作成しても、2つのサウンドを同時に再生することはできません。ネイティブWindows API「mciSendString」を取り込む必要があります。

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

    public Form1()
    {
        InitializeComponent();

        mciSendString(@"open C:\Users\Jono\Desktop\applause.wav type waveaudio alias applause", null, 0, IntPtr.Zero);
        mciSendString(@"play applause", null, 0, IntPtr.Zero);

        mciSendString(@"open C:\Users\Jono\Desktop\foghorn.wav type waveaudio alias foghorn", null, 0, IntPtr.Zero);
        mciSendString(@"play foghorn", null, 0, IntPtr.Zero);

    }
6
feathj

ここでPlaySoundメソッドをチェック http://msdn.Microsoft.com/en-us/library/aa909766.aspx とそのフラグSND_ASYNC

1
Eugen

http://alvas.net/alvas.audio,samples.aspx#sample7 および http://alvas.net/alvas.audio,samples.aspx#sample6 から

Player pl = new Player();
byte[] arr = File.ReadAllBytes(@"in.wav");
pl.Play(arr);
Player pl2 = new Player();
pl2.FileName = "123.mp3";
pl2.Play();

または、再生前にオーディオデータをミキシング 2つのオーディオファイルをミキシングする方法...

private void Mix(string outfile, string infile1, string infile2, int shiftSec)
{
    WaveReader wr1 = new WaveReader(File.OpenRead(infile1));
    WaveReader wr2 = new WaveReader(File.OpenRead(infile2));
    IntPtr format1 = wr1.ReadFormat();
    WaveFormat wf = AudioCompressionManager.GetWaveFormat(format1);
    WaveWriter ww = new WaveWriter(File.Create(outfile), AudioCompressionManager.FormatBytes(format1));
    byte[] data0 = wr1.ReadData(0, shiftSec);
    byte[] data1 = wr1.ReadData(shiftSec);
    byte[] data2 = wr2.ReadData();
    byte[] mixData = AudioCompressionManager.Mix(format1, data2, data1);
    ww.WriteData(data0);
    ww.WriteData(mixData);
    ww.Close();
    wr2.Close();
    wr1.Close();
}
0
Aleks

解決策:こんにちは、私はWP8アプリを開発していて、同時に再生するには複数のサウンドが必要でした。上記の解決策ではうまくいかなかったので、XNAフレームワークを使用しました。ここにリンクがあります

http://msdn.Microsoft.com/en-us/library/ff842408.aspx

そして、このようなウルサウンドファイルを再生します...

SoundEffect Sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Assets/Sounds/wav/sound.wav", UriKind.Relative)).Stream);
Sound.Play();

ループ用...

SoundEffectInstance Sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Assets/Sounds/wav/sound.wav", UriKind.Relative)).Stream).CreateInstance();
Sound.IsLooped = true;
Sound.Play();

注:ファイルは ".wav"(PCM、8または16ビット、8KHz〜48KHz、モノまたはステレオ)形式である必要があります。

0
Muhammad