2017-03-06 46 views
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时,我开始流式传输声音,所以有多个流式线程。

回答

1

缓冲区完全异常意味着您正在将数据写入缓冲区的速度比您读取数据时要快。如果您正在播放实时流式传输的音频,这很奇怪。你确定无论发送音频是不是给你发送超过你的期望?

为了缓解偶然的缓冲区完全异常,您可以随时清除BufferedWaveProvider(如果已满)。但是,如果它经常发生,这意味着您获得的音频速度比您播放音频的速度快。

+0

你是对的,那是问题所在。但现在我收到来自服务器的BYE请求,HangUpClause - 正常结算,我不知道为什么 – Jamil