Задать вопрос
@DS2107

Как измерить скорость интернета при отправке данных через UDP сокет?

Я написал приложение которое подключается к серверу и по протоколу 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;

        }


    }
  • Вопрос задан
  • 77 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы