Я написал приложение которое подключается к серверу и по протоколу udp я отправляю голос , перед отправкой я его шифрую , когда интернет отличный то и голос прекрасный и задержек нет , но если например я буду на 2 g то голос уже будет хрипеть , пропадать и т.д. Я хочу на этапе отправки как то замерять скорость интернета и если скорость будет ниже желаемой , то сообщать об этом клиенту. Вот мой код. Отправка происходи в методе Send , я думал если замерить хотя бы время отправки то это уже что то даст , но с любым интернет соединением метод Send срабатывает за доли секунд.
class AudioStream: IAudioStream
{
//11025
private int Frequency_Audio { get; set; } // частота звука
private int Buffer_Size { get; set; }
private AudioRecord AudioRecord = null;
private AudioTrack AudioTrack = null;
private bool StartStopAudioStream_Flag { get; set; }
private bool StartStopAudioReceiver_Flag { get; set; }
private IPEndPoint RemoteIpEndPoint;
private UdpClient Sender { get; set; }
void IAudioStream.InitUDP(UdpClient sender, IPEndPoint remoteIpEndPoint)
{
RemoteIpEndPoint = remoteIpEndPoint;
Frequency_Audio = 9025;
Sender = sender;
Buffer_Size = AudioRecord.GetMinBufferSize
(
Frequency_Audio,
ChannelIn.Mono,
Android.Media.Encoding.Pcm16bit
);
Buffer_Size = Buffer_Size - 382;
AudioRecord = new AudioRecord
(
AudioSource.Mic,
Frequency_Audio,
ChannelIn.Mono,
Android.Media.Encoding.Pcm16bit,
Buffer_Size
);
AudioTrack = new AudioTrack
(
Android.Media.Stream.VoiceCall,
Frequency_Audio,
ChannelConfiguration.Mono,
Android.Media.Encoding.Pcm16bit,
Buffer_Size,
AudioTrackMode.Stream
);
}
string speed = "";
string IAudioStream.Speed {
get { return speed; }
set { speed = value; }
}
void IAudioStream.Send(byte[] key, byte[] saltKey)
{
StartStopAudioStream_Flag = true;
byte[] buffer = new byte[Buffer_Size];
AudioRecord.StartRecording();
try
{
while (StartStopAudioStream_Flag)
{
DateTime dt1 = DateTime.Now;
AudioRecord.Read(buffer, 0, Buffer_Size);
buffer = Encrypt(buffer, key, saltKey);
Sender.Send(buffer, buffer.Length); // отправка
DateTime dt2 = DateTime.Now;
var ss = (dt2 - dt1).TotalSeconds;
speed = ss.ToString();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Sender.Close();
}
} // Send
void IAudioStream.ReceiveMessage(byte[] key, byte[] saltKey)
{
StartStopAudioReceiver_Flag = true;
try
{
while (StartStopAudioReceiver_Flag)
{
byte[] data = Sender.Receive(ref RemoteIpEndPoint); // получаем данные
data = Decrypt(data, key, saltKey);
AudioTrack.SetPlaybackRate(Frequency_Audio);
AudioTrack.Play();
AudioTrack.Write(data, 0, data.Length);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Sender.Close();
}
finally
{
// sender.Close();
}
}
void IAudioStream.StopUdp()
{
StartStopAudioReceiver_Flag = false;
StartStopAudioStream_Flag = false;
GC.Collect();
GC.WaitForPendingFinalizers();
AudioTrack = null;
AudioRecord = null;
} // StopUdp
private byte[] Encrypt(byte [] dataVoice, byte[] key, byte[] saltKey)
{
// Шифруем
Gamma gam = new Gamma(dataVoice, key, saltKey);
// Получаем шифрованный массив
var encrByteFile = gam.StartGamma();
return encrByteFile;
}
private byte[] Decrypt(byte[] dataVoice, byte[] key, byte[] saltKey)
{
Gamma gam = new Gamma(dataVoice, key, saltKey);
var encrByteFile = gam.StartGamma();
return encrByteFile;
}
}