Отправка пакетов с сервера на клиентов происходит недостаточно быстро (код включен) - PullRequest
0 голосов
/ 13 июля 2011

Я пишу приложение для видеоконференций в C #, и у меня возникают проблемы с задержкой видео,

Клиент будет извлекать изображения из веб-камеры со скоростью 10 кадров в секунду и отправлять их на сервер (один за другим) по протоколу TCP (который вскоре будет преобразован в UDP). Я использую Socket.Send, а сокет блокирует. `

if (VideoSoc != null)
{
    try
    {
        VideoSoc.SendBufferSize = picChunk.Length;
        VideoSoc.Send(picChunk);
        sendimage++;
    }
    catch (SocketException expp)
    {
        if (expp.ErrorCode == 10054)
        {
            //ConnectSockets();
            //MessageBox.Show("Video has been disconnected.");
        }
    }
    catch (Exception exppp) { }
}

на сервере. Существует класс Room, и класс User, каждый пользователь, который подключается к нему, будет иметь очередь типа byte [] для хранения изображений, полученных этим пользователем.

List<byte> bl = new List<byte>(VideoPacket.Videobuffer);
bl.RemoveRange(iRx, VideoPacket.Videobuffer.Length - iRx);
byte[] nb = new byte[bl.Count];
bl.CopyTo(nb);
Rooms[VideoPacket.Index].UsersList[VideoPacket.Pos].VideoList.Enqueue(nb);

Затем в цикле while (true) в потоке, отличном от основного потока, сервер просматривает список пользователей, получает изображение, сохраненное в очереди, и отправляет его всем другим подключенным клиентам с помощью сокета udp.

while (true)
{
    try
    {
        for (int x = 0; x < Rooms[roomindex].UsersList.Count; x++)
        {
            try
            {
                // this is my temp solution to eliminate the delay.. if more than 10 frames are stacked up in the ques.. clear them, which will effect the smoothness of the video on the client side
                if (Rooms[roomindex].UsersList[x].VideoList.Count >10)
                {
                    Rooms[roomindex].UsersList[x].VideoList.Clear();
                }
                countt = Rooms[roomindex].UsersList[x].VideoList.Count;

                if (Rooms[roomindex].UsersList[x].VideoList.Count > 0)
                {
                    byte[] videodata = Rooms[roomindex].UsersList[x].VideoList.Dequeue();

                    for (int i = 0; i < Rooms[roomindex].UsersList.Count; i++)
                    {
                        if (i != x && Rooms[roomindex].UsersList[i].Username != "u" && Rooms[roomindex].UsersList[i].Ready)
                        {
                            try
                            {
                                Rooms[roomindex].UsersList[i].udpvideosocket.SendTo(videodata, Rooms[roomindex].UsersList[i].ep);
                            }
                            catch(Exception ex) { }
                        }
                    }
                }
            }
            catch (Exception exo)
            {
                Rooms[roomindex].UsersList[x].VideoList.Clear();
            }
        }
    }
    catch (Exception VideoSendingException)
    {
         logerror(VideoSendingException);
    }

Здесь я вижу, что количество очередей видео каждого пользователя увеличивается, когда все больше и больше при подключении новых клиентов, что привело к выводу, что upd socket.send недостаточно быстр для отправки данных 20 подключенным клиентам. и это моя проблема.

Я не эксперт по сокетам, я приложил все усилия с тем, чтобы найти результаты поиска в Google, которые я бы хотел предложить. и я знаю, что мой код не самый лучший, и он не оптимизирован, поэтому приветствуются любые советы или указания в правильном направлении. Пожалуйста, не стесняйтесь обращаться за разъяснениями.

Спасибо.

из-за трудностей, с которыми сталкивается UDP, когда он находится за маршрутизаторами NAT, я снова использую TCP.

1 Ответ

1 голос
/ 13 июля 2011

Из MSDN Socket.SendTo :

If you are using a connectionless protocol in blocking mode, SendTo will block until the datagram is sent.

Как я понимаю, это именно то, что вы делаете.

...