2013-05-07 137 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

    相关问题