Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
11 / 9 / 5
Регистрация: 09.10.2019
Сообщений: 84

Video streaming UDP protocol

31.08.2021, 12:24. Показов 1062. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Пытаюсь передать видео по UDP. Данный код работает достаточно хорошо если передавать видео с разрешением 320*240, при попытке передать видео 640*480 было принято решение разбить байты на четное число ( 307200 / 30720) итого передаю 10 пакетов на клиент. Далее я их собираю на клиенте, но получаю неполный кадр с ошибкой:
Вызвано исключение: "System.ArgumentException" в System.Drawing.Common.dll
Необработанное исключение типа "System.ArgumentException" в System.Drawing.Common.dll
Parameter is not valid.


Количество байтов совпадают 307200 ушло на клиент столько же пришло, нулевых байтов вроде нет. Я понимаю, что UDP может терять пакеты, но не также))).

Сервер
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class Program
    {
        private static IPEndPoint endPoint;
        private static UdpClient client = new UdpClient();
        static void Main(string[] args)
        {
 
            var ip = "192.168.10.67";
            var port = 4394;
            endPoint = new IPEndPoint(IPAddress.Parse(ip), port);
            using var window = new Window("Stream server", WindowFlags.AutoSize);
            var capture = new VideoCapture(@"C:\video_1.avi");
            if (!capture.IsOpened())
                return;
            var frame = new Mat();
            while(true)
            {
                capture.Read(frame);
 
                if (frame.Empty())
                    break;
                
                Cv2.Resize(frame, frame, new Size(640, 480));
                window.ShowImage(frame);
                
                var bytes = frame.ToBytes(".jpeg");
               // client.Send(bytes, bytes.Length, endPoint);
                foreach (var copyBytes in bytes.Slices(30720))
                    client.Send(copyBytes, copyBytes.Length, endPoint);
 
 
                int c = Cv2.WaitKey(10);
                if (c >= 0)
                {
                    break;
                }
            }
        }
    }
    public static class Extension
    {
        public static T[] CopySlice<T>(this T[] source, int index, int length, bool padToLength = false)
        {
            int n = length;
            T[] slice = null;
 
            if (source.Length < index + length)
            {
                n = source.Length - index;
                if (padToLength)
                {
                    slice = new T[length];
                }
            }
 
            if (slice == null) slice = new T[n];
            Array.Copy(source, index, slice, 0, n);
            return slice;
        }
 
        public static IEnumerable<T[]> Slices<T>(this T[] source, int count, bool padToLength = false)
        {
            for (var i = 0; i < source.Length; i += count)
                yield return source.CopySlice(i, count, padToLength);
        }
        public static T[] Concat<T>(this T[] x, T[] y)
        {
            if (x == null) throw new ArgumentNullException("x");
            if (y == null) throw new ArgumentNullException("y");
            int oldLen = x.Length;
            Array.Resize<T>(ref x, x.Length + y.Length);
            Array.Copy(y, 0, x, oldLen, y.Length);
            return x;
        }
    }


Клиент
Кликните здесь для просмотра всего текста


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
static void Main(string[] args)
        {
            IPEndPoint RemoteIpEndPoint = null;
            using var window = new Window("Stream client", WindowFlags.AutoSize);
 
            var client = new UdpClient(4394);
            while (true)
            {
                var data = client.Receive(ref RemoteIpEndPoint);
 
                var temp = new byte[640*480];
 
                int counter = 1;
                while(counter <= 10)
                {
                    counter++;
                    temp = Combine(data);
                }
                
                ImageConverter convertData = new ImageConverter();
                Bitmap image = (Bitmap)convertData.ConvertFrom(temp);
 
                var frame = OpenCvSharp.Extensions.BitmapConverter.ToMat(image);
 
                window.ShowImage(frame);
                int c = Cv2.WaitKey(10);
                if (c >= 0)
                {
                    break;
                }
 
            }
        }
        private static byte[] Combine(byte[] array)
        {
            byte[] bytes = new byte[array.Length];
            int offset = 0;
 
            Buffer.BlockCopy(array, 0, bytes, offset, array.Length);
            offset += array.Length;
 
            return bytes;
        }
 
    }
    public static class Extension
    {
        public static T[] Concat<T>(this T[] x, T[] y)
        {
            if (x == null) throw new ArgumentNullException("x");
            if (y == null) throw new ArgumentNullException("y");
            int oldLen = x.Length;
            Array.Resize<T>(ref x, x.Length + y.Length);
            Array.Copy(y, 0, x, oldLen, y.Length);
            return x;
        }
    }


Про VLC знаю, но это решение мне не поможет, так как мне нужно работать с каждым кадром и обработанный кадр передавать клиенту. VLC может кадр только сохранять на диск это большие накладные расходы для меня.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2021, 12:24
Ответы с готовыми решениями:

UDP video stream
Здравствуйте. Разбираюсь с UDP протоколом. И вошёл в ступор когда пытался отправить видео. Были попытки отправлять чисто скриншоты экрана,...

Streaming Video
Ludi dobryje! Podskazhite '4ajniku' (v streaming video), gde est' horoschij material pro Microsoft Media Server - lu4sche po russki,...

Streaming video.
Вообщем проблема в слудющем. Как увеличить скорость просмотра фильмов онлайн? Когда я качаю файлы, у меня скорость 60-70кб, но когда...

2
11 / 9 / 5
Регистрация: 09.10.2019
Сообщений: 84
31.08.2021, 12:33  [ТС]
Вот что по факту
Миниатюры
Video streaming UDP protocol  
0
 Аватар для kernel_mode
70 / 47 / 16
Регистрация: 21.07.2021
Сообщений: 187
01.09.2021, 08:23
У вас есть алгоритм проверки целостности пакетов? А их порядок?
UDP протокол отличается от TCP протокола тем, что проверки целостности пакетов нет, также отсутствует последовательность пакетов, то есть сначала может прийти пакет #3, затем #1, затем #2. Вот и получается, что складываете пакеты не в той последовательности, либо часть из них повреждена/потеряна.

Можно открыть WireShark и посмотреть точную причину.
Могу посоветовать отказаться от UDP и сделать выбор в пользу TCP, в таком случае проверять целостность не будет необходимости, ведь эта функция уже реализована в протоколе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.09.2021, 08:23
Помогаю со студенческими работами здесь

html5 video pseudo streaming
Проблема следующего рода. Есть mp4 файл, проигрывается с помощью тега video. Пока файла нет в кеше, при нажатии на незагруженную...

[Android] Как проиграть streaming video?
Господа, подскажите плиз, как проиграть streaming video? TMediaPlayer справится? Как он работает с удаленным видео с сервера:...

RED5 Flex4 Video/Audio Streaming
Ребята... Добрый денб. Я создал веб-программу он-лайн чата. Исползовал RED5 и Flex4.5. Но есть проблема. Текстовый- и аудио-чат работают....

Streaming Video Recorder - Разделение фильма на сегменты
Доброго дня всем! Установила программу Streaming Video Recorder, дабы записывать фильмы, которые смотрю онлайн. Некоторые фильмы...

UDP -protocol
Реализовал я TCP protocol который принимает 1 500 000 байт в 150 - 200 мс, а хотелось бы быстрее, по этому рассматриваю UDP протокол,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru