[英]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.