【发布时间】:2014-03-24 06:34:47
【问题描述】:
我正在用 C# 编写。
我有一个实时音频播放器,可以播放来自 IP 电话的传入语音。我有一个byte[] Array,当它进入时,它会获取所有的语音字节,当用户按下播放按钮时,我开始播放它。我也有停止和暂停按钮。我为此使用 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));
}
请帮忙?这个问题我纠结了好久。。
提前致谢!
【问题讨论】: