1
我尝试制作软电话。它通过声音,但5秒后,我得到“缓冲区满”的例外。c# - NAudio缓冲区全部异常
这里是我的发送代码:
public class Media
{
static WaveInEvent s_WaveIn = new WaveInEvent();
Action<byte[]> waveHandler;
public void Capture(Action<byte[]> toRtp)
{
s_WaveIn = new WaveInEvent();
s_WaveIn.WaveFormat = new WaveFormat(8000, 1);//44100, 2);
waveHandler = toRtp;
s_WaveIn.DataAvailable += new EventHandler<WaveInEventArgs>(SendCaptureSamples);
s_WaveIn.StartRecording();
}
void SendCaptureSamples(object sender, WaveInEventArgs e)
{
waveHandler(e.Buffer);
}
public void Stop()
{
s_WaveIn.StopRecording();
}
}
ToRtp是
private void ToRtp(byte[] buffer)
{
myRTP.SequenceNumber++;
Sender.SendResponse(myRTP.MakePacket(alaw.Encode(buffer,0,buffer.Length)), RTPClient, rtpPort);//ToRTPData(buffer, 8000, 1), myUdpClient);
}
接收:
class Client
{
WaveFormat pcmFormat = new WaveFormat(8000, 16, 1);
WaveFormat alawFormat = WaveFormat.CreateALawFormat(8000, 1);
WaveOut waveOut;
BufferedWaveProvider waveProvider;
ALawChatCodec alaw = new ALawChatCodec();
public Client(IHandlerFactory handlerFactory, IPAddress hostAddress, int portNumber)
{
waveOut = new WaveOut();
waveProvider = new BufferedWaveProvider(pcmFormat);
waveOut.Init(waveProvider);
waveOut.Play();
}
private void HandleIncomingRTPRequest(IAsyncResult ar)
{
IPEndPoint temp = new IPEndPoint(IPAddress.Parse(asteriskip), rtpPort);
byte[] received = RTPClient.EndReceive(ar, ref temp);
byte[] decoded = alaw.Decode(received, 12, received.Length - 12);
waveProvider.AddSamples(decoded, 0, decoded.Length);//Exception occures here
}
}
我看过类似的问题,每个人都建议不要使用WaveInProvider,但在这些问题他们不需要传输声音,他们只需保存它。为什么我得到这个异常,如果是因为WaveInProvider,我怎么能没有它流?
编辑。问题在于我没有通过SIP发送正确的ACK请求,并且在得到对最初的INVITE请求的OK响应之后我发送了它。结果,Asterisk给我发送了另一个OK响应,当我收到一个INVITE请求的OK时,我开始流式传输声音,所以有多个流式线程。
你是对的,那是问题所在。但现在我收到来自服务器的BYE请求,HangUpClause - 正常结算,我不知道为什么 – Jamil