Я настроил источник, размещенный в вопросе, чтобы разрешить использование с Google TTS API, чтобы ответить на вопрос здесь :
bool waiting = false;
AutoResetEvent stop = new AutoResetEvent(false);
public void PlayMp3FromUrl(string url, int timeout)
{
using (Stream ms = new MemoryStream())
{
using (Stream stream = WebRequest.Create(url)
.GetResponse().GetResponseStream())
{
byte[] buffer = new byte[32768];
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
}
ms.Position = 0;
using (WaveStream blockAlignedStream =
new BlockAlignReductionStream(
WaveFormatConversionStream.CreatePcmStream(
new Mp3FileReader(ms))))
{
using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
{
waveOut.Init(blockAlignedStream);
waveOut.PlaybackStopped += (sender, e) =>
{
waveOut.Stop();
};
waveOut.Play();
waiting = true;
stop.WaitOne(timeout);
waiting = false;
}
}
}
}
Вызвать с:
var playThread = new Thread(timeout => PlayMp3FromUrl("http://translate.google.com/translate_tts?q=" + HttpUtility.UrlEncode(relatedLabel.Text), (int)timeout));
playThread.IsBackground = true;
playThread.Start(10000);
Завершить с:
if (waiting)
stop.Set();
Обратите внимание, что я использую ParameterizedThreadDelegate
в приведенном выше коде, и поток запускается с playThread.Start(10000);
. 10000 представляет максимум 10 секунд звука для воспроизведения, поэтому его необходимо настроить, если для воспроизведения требуется больше времени, чем этот поток. Это необходимо, потому что текущая версия NAudio (v1.5.4.0), похоже, имеет проблемы с определением, когда закончится воспроизведение потока. Это может быть исправлено в более поздней версии или, возможно, есть обходной путь, который я не нашел времени.