C# 使用任务还是其他什么?
我在用C#写 我有一个实时音频播放器,可以播放来自IP电话的传入语音。我有一个C# 使用任务还是其他什么?,c#,real-time,voip,naudio,C#,Real Time,Voip,Naudio,我在用C#写 我有一个实时音频播放器,可以播放来自IP电话的传入语音。我有一个byte[]数组,当它进入时,它获取所有语音字节,当用户按下播放按钮时,我开始播放它。我也有停止和暂停按钮。我将NAudio用于BufferedWaveProvider和Waveout类 播放器类中的代码: public void PlayCall(Call call) { byte[] mixedBuffer = new byte[320]; while (call.PlayerI
byte[]数组
,当它进入时,它获取所有语音字节,当用户按下播放按钮时,我开始播放它。我也有停止和暂停按钮。我将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();
}
请帮忙?我已经为此挣扎了很长时间
提前谢谢 我怀疑多次调用Waveout.Play()就是问题所在。您只需要调用一次
Play()
,然后将样本馈送到源wave提供程序(您的BufferedWaveProvider
实例)中,库就会处理其余的。当wave provider为空时,WaveOut
对象将继续播放静音,直到您提供更多样本
顺便说一句,这一切都可以在一个线程中实现。创建WaveOut
实例,创建一个BufferedWaveProvider
作为示例缓冲区,并将其设置为运行。然后,当音频数据可用时,您只需将数据添加到BufferedWaveProvider
即可播放
BufferedWaveProvider
使用线程安全的内部缓冲区,因此,如果您觉得确实需要添加缓冲区,可以安全地从其他线程添加。谢谢!它似乎是工作后,我改变了它,我只是采取了Waveout。发挥了WHILE循环。还有一个问题-Waveout.Stop和Waveout.Pause之间有什么区别?我在某个地方读到,其中一个清除了缓冲区,而另一个没有?
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));
}