2010-12-08 17 views
5

C# 'de naudio lib kullanıyorum ve basit bir dosya çalmak istiyorum. Sorun şu ki, oynatma 1 saniye sonra durur. Bunun nedenini anlayamıyorum.Naudio'yu kullanarak bir .wav dosyasını oynatma, oynatma 1 sn sonra durur

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

Eğer 'görüşüyorsun "[Enter] iptal etmek" oynamaya başladığında'? –

+0

Daha büyük bir uygulama için kodu kanıtlamak amacıyla bir demo uygulaması kullanmıyorsanız, 'System.Media.SoundPlayer' kullanabilirsiniz. –

+0

kodunda ne yazık ki kod test ettiğim hata ayıklama kodunun bir parçasıydı, düzeltin. @mark, evet ben 1socamı çalarken görüyorum. – Robby

cevap

6

Sen WaveOut için varsayılan pencere geri aramalar kullanmaktır beri, bir konsol uygulamasından ses oynamaya çalışıyoruz eğer fonksiyon geri aramalar kullandığınızdan emin olmak gerekir.

new WaveOut(WaveCallbackInfo.FunctionCallback()) 

Güncelleme: NAudio yeni sürümlerinde ile şimdi belli sürücülerle kilitlenmeleri neden olabilir gibi, işlev geri aramalar kaçınmanızı öneririz. Bunun yerine, WaveOutEvent olay geri aramalar kullanır ve bir arka plan iş parçacığı tercih mekanizmadır ki:

new WaveOutEvent() 
+0

çok teşekkürler :) Bu sorunu çözdü. – Robby

İlgili konular