web-dev-qa-db-fra.com

Jouez deux sons simultanément 

Est-il possible de jouer deux sons en même temps?

Je sais que SoundPlayer n'est pas capable de faire cela . Je ne peux pas utiliser SoundEffect car je crois que ce n'est qu'une partie de XNA.

Les deux sons requis seront appelés à des moments inconnus et aléatoires. Le son doit être contrôlé après sa lecture. c'est-à-dire que le son doit pouvoir être arrêté avant la fin de la lecture.

26
AlanFoster

Référence PresentationCore et WindowsBase et essayez ceci ...

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 J'ai reçu un vote négatif probablement parce qu'au premier abord cela donne l'impression que le deuxième son sera joué une fois le premier terminé. Ce n'est pas, ils sont joués par Windows de manière asynchrone. Le sommeil est là, donc si vous testez ce code mot à mot, vous pouvez entendre les sons jouer ensemble, il ne serait pas perceptible sans délai, car ils sont le même son.

Ce code montre les deux sons joués sur des threads séparés, ce qui est inutile car la lecture ne bloque pas de toute façon.

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 La classe dispose également du contrôle nécessaire pour arrêter la lecture.

29
JeremyWeir

L'objet "MediaPlayer" ne vous permettra pas de jouer deux sons à la fois, même si vous créez deux instances. Vous devez importer l'API Windows native "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

vérifiez la méthode PlaySound ici http://msdn.Microsoft.com/en-us/library/aa909766.aspx et son indicateur SND_ASYNC.

1
Eugen

De http://alvas.net/alvas.audio,samples.aspx#sample7 et 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();

ou mixer des données audio avant de jouer Comment mixer pour mixer deux fichiers audio ..

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

Solution: Bonjour, Je développais une application WP8 et j'avais besoin de plusieurs sons pour jouer simultanément, les solutions mentionnées ci-dessus ne fonctionnaient pas pour moi, j'ai donc utilisé le cadre XNA. Voici le lien 

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

puis jouez vos fichiers sonores comme ça ...

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

Pour boucler ...

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

Remarque: les fichiers doivent être au format ".wav" (PCM, 8 ou 16 bits, 8KHz à 48KHz, mono ou stéréo).

0
Muhammad