소프트 폰을 만들려고합니다. 사운드는 지나치지 만 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를 받으면 나는 스트리밍 사운드를 시작하므로 여러 개의 스트리밍 스레드가있었습니다.
맞습니다. 이것이 문제였습니다. 하지만 이제는 서버에서 BYE 요청을받습니다. HangUpClause - 정상적인 삭제 및 이유를 알지 못합니다. – Jamil