2010-12-08 14 views
5

Estoy usando la versión de audio en C# y quiero reproducir un archivo simple. El problema es que la reproducción se detiene después de 1 segundo. No puedo entender la razón por la que hace eso.Reproducción de un archivo .wav usando naudio, la reproducción se detiene después de 1 segundo

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using NAudio.Wave; 

namespace NAudioTest 
{ 
    class Program 
    { 
     static IWavePlayer waveout; 
     static WaveStream outputStream; 
     static string filename = null; 

     static void Main(string[] args) 
     { 
      waveout = new WaveOut(); 

      filename = "C:\\1.wav"; 

      outputStream = CreateInputStream(filename); 

      try 
      { 
       waveout.Init(outputStream); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Error while loading output"); 
       Console.WriteLine("Details: " + ex.Message); 
       Console.ReadLine(); 
       return; 
      } 

      Console.WriteLine("Press [Enter] to start playback"); 
      Console.ReadLine(); 

      waveout.Play(); //this stops after 1 sec. should it play until i hit enter cause of the next line? 

      Console.WriteLine("Press [Enter] to abort"); 
      Console.ReadLine(); 
      waveout.Dispose(); 
      Console.ReadLine(); 
     } 


     static WaveStream CreateInputStream(string name) 
     { 
      WaveChannel32 inputStream; 
      if (name.EndsWith(".wav")) 
      { 
       WaveStream readerStream = new WaveFileReader(name); 
       if (readerStream.WaveFormat.Encoding != WaveFormatEncoding.Pcm) 
       { 
        readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream); 
        readerStream = new BlockAlignReductionStream(readerStream); 
       } 

       if (readerStream.WaveFormat.BitsPerSample != 16) 
       { 
        var format = new WaveFormat(readerStream.WaveFormat.SampleRate, 16, readerStream.WaveFormat.Channels); 
        readerStream = new WaveFormatConversionStream(format, readerStream); 
       } 
       inputStream = new WaveChannel32(readerStream); 
      } 
      else 
      { 
       throw new InvalidOperationException("Invalid extension"); 
      } 
      return inputStream; 
     } 
    } 
} 
+0

¿Está viendo ' "Pulse [Enter] para abortar"' cuando se inicia la reproducción? –

+0

Podría usar 'System.Media.SoundPlayer' a menos que esté usando una aplicación de demostración para verificar el código de una aplicación más grande. –

+0

lo siento en el código era parte del código de depuración que he probado, lo corrijo. @mark, sí lo veo mientras toco el 1 segundo. – Robby

Respuesta

6

usted necesita para asegurarse de que está utilizando las devoluciones de llamada de función si está intentando reproducir el audio de una aplicación de consola, ya que el valor predeterminado para WaveOut es utilizar devoluciones de llamada de la ventana.

new WaveOut(WaveCallbackInfo.FunctionCallback()) 

Actualización: Con las nuevas versiones de NAudio ahora recomendamos que evite las devoluciones de llamada de función, ya que pueden causar bloqueos con ciertos conductores. En su lugar, WaveOutEvent que utiliza devoluciones de llamada de eventos y un hilo de fondo es el mecanismo preferido:

new WaveOutEvent() 
+0

muchas gracias :) esto resolvió el problema. – Robby

Cuestiones relacionadas