私はソフトフォンを作ろうとしています。それは音を渡しますが、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を受け取ったときにストリーミングサウンドを開始するので、複数のストリーミングスレッドがありました。
あなたは正しいです、それは問題でした。しかし、今私はサーバーからのBYE要求を受け取る、HangUpClause - 通常のクリア、そして私はなぜか分からない – Jamil