2011-07-18 31 views
7

Soy un experimentado programador de MFC de muchos años, que durante los últimos años ha estado desarrollando aplicaciones comerciales en Objective C para Mac e iOS. Estoy tratando de ponerme al día con .Net y C# (ya que pronto se requerirá que convierta una de mis aplicaciones comerciales de Mac a PC).Reproducción de audio en .Net/C#

Ahora me he abierto paso a través de un par de libros y como un ejercicio para familiarizarme más con .Net (y C#) he decidido probar la conversión de una de mis aplicaciones comerciales a .Net como un ejercicio de aprendizaje y todo va bien (la interfaz funciona, las estructuras de datos funcionan bien) pero necesito poder reproducir audio.

Mi aplicación Mac genera audio a partir de una serie de fórmulas matemáticas - imagine un generador de ondas - no exactamente igual pero similar. En la Mac, genero el audio como audio sin formato de 16 bits, uso Core Audio para configurar el enrutamiento de salida de audio y luego obtengo una devolución de llamada siempre que se requiera un nuevo buffer de audio para el enrutamiento de audio (para poder generar el audio sobre la marcha) .

Necesito hacer lo mismo en la PC. Lamentablemente, encuentro que la documentación de MSDN es un caso de "No se puede ver la madera de los árboles", ya que existe una gran cantidad de documentación. Puedo encontrar clases que me permitan cargar y reproducir archivos mp3/wav etc., pero necesito generar el audio en tiempo real. ¿Alguien puede señalarme en la dirección correcta para encontrar algo que me permita llenar los búferes sobre la marcha a medida que los reproduce?

Thx

+0

que saben muy poco acerca de este tema, pero me encontré con este artículo que * puede * ayuda: http://channel9.msdn.com/coding4fun/articles/Generating-Sound-Waves- con-C-Wave-Oscillators –

+0

Eche un vistazo a esto: [Reproducir audio de una secuencia usando C#] (http://stackoverflow.com/questions/184683/play-audio-from-a-stream-using-c) – Rodney

Respuesta

3

He usado this sample en varios proyectos con buenos resultados. Básicamente es un contenedor .Net para Windows Waveform Audio API usando P/Invoke. Otras opciones:

+0

Todo muy útil, y la demostración de onda sinusoidal en el sitio web de NAudio parece hacer exactamente lo que quiero, debería ser capaz de modificar ese código y obtener el resultado que necesito, ¡muchas gracias! –

+0

Después de aproximadamente una hora, NAudio se puso en funcionamiento y funcionó a la perfección. ¡Ahora mi aplicación es expresivamente auditiva! ¡Muchas gracias por la sugerencia! : O) –

+0

Me alegra que te haya gustado. – yms

2

utilizo Audiere para lograr esto y encontrar que funciona muy bien.

Es realmente una lib de C++, pero hay un set of bindings disponible para C#.

Para obtener más información, consulte the question I asked.

+0

¡Gracias, echaremos un vistazo! –

2

Debería echar un vistazo a FMOD que permite este tipo de operación y mucho más. También es multiplataforma lo que puede interesarle si también está trabajando en un mac.

+0

Suena interesante, voy a echar un vistazo a eso, gracias. –

3

He creado una clase que puede reproducir audio dado Stream derivada como entrada. Entonces, si puede empaquetar su generador de sonido en la interfaz compatible Stream, podría ser adecuado para usted.

Cómo lo hice - Utilicé los métodos no administrados waveOut* de la antigua API multimedia de Windows y manejé la reproducción desde allí.

Otras opciones que conozco, use waveOut directamente, desde aquí: http://windowsmedianet.sourceforge.net/ o escriba su propio filtro de fuente DirectShow, pero eso podría ser demasiado complicado, ya que tiene que estar escrito en C++.

Si está interesado en probar mi componente, puedo ponerlo a su disposición sin cargo, ya que lo necesito beta probado (solo lo usé en varios de mis proyectos).

EDIT:

Puesto que hay 6 upvotes a la pregunta, estoy ofreciendo mi componente de forma gratuita (si encuentra útil) aquí: http://dl.dropbox.com/u/10020780/SimpleAudioPlayer.zip

Tal vez se puede reflexionar sobre ella :)

+0

Una vez más, un montón de respuestas, eche un vistazo a esto también, le dará su opinión una vez que lo haya probado. Aclamaciones. –

1

Alvas.Audio tiene 3 reproductores de audio: Player

 player.FileName = "123.mp3"; 
     player.Play(); 

PlayerEx

 public static void TestPlayerEx() 
     { 
      PlayerEx plex = new PlayerEx(); 
      plex.Done += new PlayerEx.DoneEventHandler(plex_Done); 
      Mp3Reader mr = new Mp3Reader(File.OpenRead("in.mp3")); 
      IntPtr format = mr.ReadFormat(); 
      byte[] data = mr.ReadData(); 
      mr.Close(); 
      plex.OpenPlayer(format); 
      plex.AddData(data); 
      plex.StartPlay(); 
     } 

     static void plex_Done(object sender, DoneEventArgs e) 
     { 
      if (e.IsEndPlaying) 
      { 
       ((PlayerEx)sender).ClosePlayer(); 
      } 
     } 

y RecordPlayer

 public static void TestRecordPlayer() 
     { 
      RecordPlayer rp = new RecordPlayer(); 
      rp.PropertyChanged += new PropertyChangedEventHandler(rp_PropertyChanged); 
      rp.Open(new Mp3Reader(File.OpenRead("in.mp3"))); 
      rp.Play(); 
     } 

     static void rp_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      switch (e.PropertyName) 
      { 
       case RecordPlayer.StateProperty: 
        RecordPlayer rp = ((RecordPlayer)sender); 
        if (rp.State == DeviceState.Stopped) 
        { 
         rp.Close(); 
        } 
        break; 
      } 
     } 
Cuestiones relacionadas