2011-06-04 19 views
23

¿Hay alguna manera de reproducir dos sonidos al mismo tiempo?Reproduce dos sonidos al mismo tiempo

Sé que SoundPlayer no puede hacer esto. No puedo usar SoundEffect ya que creo que es solo parte de XNA.

Los dos sonidos requeridos se invocarán en momentos desconocidos y aleatorios. El sonido debe controlarse después de su reproducción. es decir, el sonido debe poder detenerse antes de que termine de reproducirse.

+1

Qué ambiente? ASP.NET/web? WinForms? WPF Desktop? Silverlight? –

+0

¡Hola, es para una aplicación de formulario de Windows! – AlanFoster

Respuesta

25

Referencia PresentationCore y WindowsBase y probar este ...

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(); 

EDITAR recibí una downvote probablemente porque a primera vista esto parece que va a jugar el segundo sonido después de la primera ha terminado. No lo hace, son reproducidas por Windows de forma asincrónica. El sueño está allí, así que si pruebas este código textualmente, puedes escuchar los sonidos juntos, no se notará sin la demora ya que son el mismo sonido.

Este código muestra los dos sonidos que juegan en hilos separados uno encima del otro, lo que es una especie de sentido ya que la reproducción no bloquear todos modos

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 clase también tiene el control que necesita para detener la reproducción

+0

¿Puedo detener el audio a la hora especificada (digamos después de 10 segundos) cuando se reproduce? – deathrace

+0

fuera de interés He intentado usar el nuevo código Thread, que se ejecuta, pero no se reproduce nada ... aunque funciona bien con el primer bloque de código. ¿El audio tiene que pasar en el hilo principal? – lex

4

El objeto "MediaPlayer" no le permitirá reproducir dos sonidos a la vez, incluso si crea dos instancias. Tendrá que traer la API nativa de windows "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); 

    } 
0

cheque PlaySound método aquí http://msdn.microsoft.com/en-us/library/aa909766.aspx, y su bandera SND_ASYNC.

+0

PlaySound no puede reproducir dos sonidos al mismo tiempo, incluso si usa el indicador asíncrono. Es posible que pueda hacer que esto funcione al tener dos hilos separados que llaman a PlaySound de forma síncrona. – selbie

+0

Usted solo lo llama por horas seguidas, cuando usa ese indicador el método saldrá inmediatamente y el segundo comenzará. – Eugen

-1

Solución: Hola, Estuve desarrollando una aplicación WP8 y necesitaba varios sonidos para tocar al mismo tiempo, las soluciones mencionadas anteriormente no me funcionaron, así que utilicé el framwork XNA. aquí está el enlace

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

y luego reproducir archivos de sonido ur así ...

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

para recorrer ...

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

Nota: los archivos deben estar en Formato ".wav" (PCM, 8 o 16 bits, 8KHz a 48KHz, mono o estéreo)

-1

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

o mezclar datos de audio antes de jugar How to mix to mix two audio file..

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(); 
} 
Cuestiones relacionadas