簡體   English   中英

有沒有一種方法可以在NAudio中同步播放WAV文件?

[英]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中起作用。

您的問題最可能的解釋是:

  1. 您正在嘗試從仍在寫入的MemoryStream播放
  2. 您的輸出設備超出范圍並在仍在播放時被垃圾回收

嘗試訂閱IWavePlayerPlaybackStopped事件,以查看觸發的時間和原因(如果出現問題,它可以包含異常)。

另外,我非常懷疑您是否需要WaveFormatConversionStreamBlockAlignReductionStream,因此可以通過刪除它們來簡化代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM