簡體   English   中英

使用任務或其他?

[英]Use Task or something else?

我正在用C#編寫。

我有一個實時音頻播放器,可以播放IP電話中的傳入語音。 我有一個byte[] Array ,當它進入時它會獲取所有語音字節,並且當用戶按下PLAY按鈕時,我便開始播放它。 我也有“停止”和“暫停”按鈕。 我為此使用NAudio,BufferedWaveProvider和Waveout類。

玩家等級代碼:

public void PlayCall(Call call)
{
         byte[] mixedBuffer = new byte[320];
         while (call.PlayerIndex < call.AudioArray.Length) // The AudioArray keeps getting bigger
         {
             if (_state == PlayerState.PAUSED || _state == PlayerState.STOPPED)
             // either STOP or PAUSE button is clicked
                  break;
             for (int i = 0; i < 320; i++)
             {
                  mixedBuffer[i] = (byte)(call.AudioArray[call.PlayerIndex + i];
             }
             call.PlayerIndex += 320;
             Thread.Sleep(20); // This is in order to synchronize the receiving and playing of the packets. 
             try
             {
                  AddSamples(mixedBuffer);
                  Waveout.Play();
             }
             catch (InvalidOperationException ex)
             {
                  _bufferedWaveProvider.ClearBuffer();

             }
             finally
             {
                  ClearByteArray(ref mixedBuffer);
             }
         }
}

public void StopCall(Call call)
{        
    _state = PalyerState.STOPPED;
    call.PlayerIndex=0;
    Waveout.Stop();
}

public void PauseCall(Call call)
{
    _state = PlayerState.PAUSED;
    Waveout.Pause();
}

_state用於通話狀態(播放,已停止,已暫停)。 如您所見,當按下PLAY時,它將一直播放,直到按下STOP / PAUSED,然后中斷。 (WHILE循環)。

我的問題是,當我稍微按下按鈕后,在某些時候,Waveout.PLAY不再起作用,因此BufferedWaveProvider變滿並崩潰了。 (它發生在兩次單擊之后的某個時間,有時是在10次更改之后)。

我認為這與我調用方法的方式有關。 也許與Threads / Tasks混用了,或者不確保其中一種方法結束了。.就像這樣:

視圖模型上的代碼:

private void ExecutePlayCallMethod(Call call)
{
    call.Player.State = PlayerState.PLAYING;
    Task.Run(() => call.Player.PlayCall(call)); // 
}

private void ExecutePauseCallMethod(CAll call)
{
    Task.Run(() => call.Player.PauseCall(call));
    call.Player.State = PlayerState.PAUSED;
}

private void ExecuteStopCallMethod(Call call)
{
    call.Player.State = PlayerState.STOPPED;
    Task.Run(() => call.Player.StopCall(call));
}

請幫助? 我已經為此苦苦掙扎了很長時間。

提前致謝!

我懷疑多次調用Waveout.Play()是問題所在。 您只需要調用一次Play() ,然后將樣本輸入到源wave提供程序(您的BufferedWaveProvider實例)中,庫將負責其余的工作。 當wave提供程序為空時, WaveOut對象將繼續靜音,直到您提供更多樣本為止。

偶然地,這都可以在單個線程中實現。 創建WaveOut實例,創建一個BufferedWaveProvider作為示例緩沖區並使其運行。 然后,當音頻數據可用時,您要做的就是將數據添加到BufferedWaveProvider ,然后將其播放。

BufferedWaveProvider使用線程安全的內部緩沖區,因此如果確實需要從其他線程進行添加,則是安全的。

暫無
暫無

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

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