我可能是錯的,但是看起來我在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;
//}
好像我失去了一些東西簡單,但我似乎無法得到這個在語音課上工作,只能從表格中獲得。
我打算將此標記爲已接受的答案 - 即使當我開始一切備份並添加了斷點時,一切都開始正常工作!我甚至把它放在後臺線程中,它仍然有效......當我退出,重新開始並重建時,它可能已經被修復了嗎? IDK。 (我也拿出WaveFormatConversionStream和BlockAlignReductionStream,雖然我懷疑是造成這個問題......) – MarkJoel60 2013-05-08 16:39:02