2017-03-06 31 views
1

私はソフトフォンを作ろうとしています。それは音を渡しますが、5秒後に "Buffer Full"例外が発生します。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の理由なら、どうすればストリームなしでストリームできますか?

EDIT。問題は、SIP経由で正しいACKリクエストを送信しなかったことです。最初のINVITEリクエストに対してOK応答を得た後に送信します。結果として、アスタリスクは別のOKレスポンスを送ってくれました。私はINVITEリクエストでOKを受け取ったときにストリーミングサウンドを開始するので、複数のストリーミングスレッドがありました。

答えて

1

バッファフル例外とは、バッファにデータを書き込んでいるときより速くバッファに書き込むことを意味します。あなたがリアルタイムでストリーミングされているオーディオを再生している場合、これは奇妙です。あなたは、オーディオを送信しているものがあなたの期待以上にあなたを送っていないと確信していますか?

バッファフルの例外を緩和するには、BufferedWaveProviderがいっぱいになるとそれをクリアすることができます。しかし、それが定期的に起こっている場合、それはあなたがそれを再生できるよりも速く入ってくるオーディオを取得していることを意味します。

+0

あなたは正しいです、それは問題でした。しかし、今私はサーバーからのBYE要求を受け取る、HangUpClause - 通常のクリア、そして私はなぜか分からない – Jamil