2013-05-07 133 views
0

我可能是錯的,但是看起來我在NAudio中的WAV文件是異步播放的,如果我從庫中調用它,我可以聽到WAV開始,但它幾乎立即退出(並停止播放)。有沒有辦法在NAudio中同步播放WAV文件?

如果我從窗體(保持打開狀態)運行它,那很好。但是,如果我試圖從代碼運行它作爲後臺線程,我只會在開始時聽到一個小碎片。它聽起來像方法在聲音播放完畢之前退出。

我使用的文本到語音合成器對內存流創建WAV:

 SpeechSynthesizer m_speechSynth = new SpeechSynthesizer(); 
     m_speechSynth.Volume = 100; 
     m_speechSynth.Rate = 2; 

     MemoryStream waveStream = new MemoryStream(); 

     m_speechSynth.SetOutputToWaveStream(waveStream); 
     m_speechSynth.Speak(txtToRead); 
     m_speechSynth.SetOutputToNull(); 

     waveStream.Position = 0; // reset counter to start 

這工作正常。然後,我創建一個類,我纏n音訊:

VoiceThroughNetAudio netAudio = new VoiceThroughNetAudio(waveStream, "WAV"); 

我試圖保持代碼示例這裏容易執行...但這個類的確僅僅是初始化的事情,並給了我一個更高的水平控制上做的n音訊播放器的主要事情......裏面的VoiceThroughNetAudio構造,

首先我從MemStream創建讀者流:

  readerStream = new WaveFileReader(memStream); 
      readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream); 
      readerStream = new BlockAlignReductionStream(readerStream); 

並附加一個音量控制(所以我可以放大它):

_volumeStream = new WaveChannel32(Reader); 

,當我把它從我的WinForm的代碼這一切工作正常:幾乎立即

 MemoryStream waveStream = new MemoryStream(); 
     ReadStringAmplified(readTextField.Text, waveStream); // TTS to waveStream 
     VoiceThroughNetAudio PlaySound = new VoiceThroughNetAudio (waveStream, "WAV"); 
     PlaySound.Volume = 9; 
     PlaySound.Play(); 

但是,當我提出這個代碼進入語音類代替,聲音開始播放,然後停止( )。就像它正在開始一個事件,然後在聲音結束之前退出?如果是這樣,是否有一種方法可以讓方法等到聲音結束? (我嘗試了一段時間的循環,並檢查狀態,但這只是進入無限期的while循環(註釋在這裏...)

下面是當我將它移動到。語音類如果我實例從表單,並運行它都在那裏,我也得到了被截斷的聲音:

 SpeechSynthesizer m_speechSynth = new SpeechSynthesizer(); 
     m_speechSynth.Volume = 100; 
     m_speechSynth.Rate = 2; 

     MemoryStream waveStream = new MemoryStream(); 
     m_speechSynth.SetOutputToWaveStream(waveStream); 
     m_speechSynth.Speak(txtToRead); 
     m_speechSynth.SetOutputToNull(); 
     waveStream.Position = 0; // reset counter to start 

     VoiceThroughNetAudio netAudio = new VoiceThroughNetAudio(waveStream, "WAV"); 
     netAudio.Volume = 9; 
     TimeSpan ts = netAudio.TotalDuration; 
     string len = ts.Milliseconds.ToString(); 

     netAudio.Play(); 

     //VoiceThroughNetAudio.PlayBackState chkState = netAudio.State; 
     //while (netAudio.State != VoiceThroughNetAudio.PlayBackState.Stopped) 
     //{ 
     // chkState = netAudio.State; 
     //} 

好像我失去了一些東西簡單,但我似乎無法得到這個在語音課上工作,只能從表格中獲得。

回答

1

對於您的問題,最可能的解釋是:

  1. 您試圖同時它仍然發揮

嘗試訂閱到PlaybackStopped事件從一個仍在寫入

  • 輸出設備已經超出了範圍和被垃圾收集MemoryStream玩你的IWavePlayer,看看它是什麼時候和爲什麼發射(如果有問題,它可以包含一個例外)。

    另外,我非常懷疑你需要一個WaveFormatConversionStream和一個BlockAlignReductionStream,所以通過刪除這些來簡化你的代碼。

  • +0

    我打算將此標記爲已接受的答案 - 即使當我開始一切備份並添加了斷點時,一切都開始正常工作!我甚至把它放在後臺線程中,它仍然有效......當我退出,重新開始並重建時,它可能已經被修復了嗎? IDK。 (我也拿出WaveFormatConversionStream和BlockAlignReductionStream,雖然我懷疑是造成這個問題......) – MarkJoel60 2013-05-08 16:39:02

    相關問題