[英]Is there a way to Play a WAV File Synchronously in NAudio?
我對此可能是錯的,但是看來我在NAudio中的WAV文件正在異步播放,並且如果我從庫中調用它,我可以聽到WAV開始,但是它幾乎立即退出(並停止播放)。
如果我從一個Form(保持打開狀態)運行它,那很好。 但是,如果我嘗試從代碼中將其作為后台線程運行,則一開始我只會聽到一個小片段。 聽起來好像方法在聲音播放完畢之前就退出了。
我正在使用文本語音合成器在內存流上創建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
很好 然后,我創建一個圍繞NAudio包裹的類:
VoiceThroughNetAudio netAudio = new VoiceThroughNetAudio(waveStream, "WAV");
我試圖使此處的代碼示例易於理解...但是此類的作用只是初始化事情,並為我提供了更高級別的控制權,使其可以在NAudio播放器上執行主要操作... VoiceThroughNetAudio構造函數內部,
首先,我從MemStream創建一個閱讀器Stream:
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();
但是,當我將這段代碼移入Voice類時,聲音開始播放,然后停止(幾乎立即停止)。 像是開始一個事件,然后在聲音結束之前退出? 如果是這樣,是否有一種好的方法可以讓該方法等待聲音結束? (我試圖放入一個while循環並檢查狀態,但這最終進入了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;
//}
似乎我缺少一些簡單的東西,但是我似乎無法僅在Form中使它在Voice Class中起作用。
您的問題最可能的解釋是:
MemoryStream
播放 嘗試訂閱IWavePlayer
的PlaybackStopped
事件,以查看觸發的時間和原因(如果出現問題,它可以包含異常)。
另外,我非常懷疑您是否需要WaveFormatConversionStream
和BlockAlignReductionStream,
因此可以通過刪除它們來簡化代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.