2017-03-06 48 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 응답을받은 후에 보냅니다. 결과적으로, Asterisk는 또 다른 OK 응답을 보냈고, INVITE 요청에 OK를 받으면 나는 스트리밍 사운드를 시작하므로 여러 개의 스트리밍 스레드가있었습니다.

답변

1

버퍼 가득 참 예외는 버퍼에 데이터를 쓰는 것이 버퍼를 읽는 것보다 빠르게 수행한다는 것을 의미합니다. 실시간으로 스트리밍되는 오디오를 재생하는 경우 이상합니다. 오디오를 보내고있는 것이 무엇이든 당신을 기대 이상으로 보내지 않는다고 확신합니까?

버퍼 가득 참 예외를 완화하기 위해 BufferedWaveProvider가 가득 차면이를 지울 수 있습니다. 그러나 정기적으로 발생하는 경우 들어오는 오디오를 재생할 수있는 속도보다 빠르게 수신하고 있음을 의미합니다.

+0

맞습니다. 이것이 문제였습니다. 하지만 이제는 서버에서 BYE 요청을받습니다. HangUpClause - 정상적인 삭제 및 이유를 알지 못합니다. – Jamil