Передача видео потока по UDP

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5458
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Передача видео потока по UDP

Сообщение IvanLis »

Передача видео потока по UDP

на днях пришлось делать программу, точнее пару
первая из них осуществляет захват видео потока с USB видеокамеры (Web-камеры) и передавать его по UDP протоколу
вторая осуществляет прием этих самых данных и отображать видео поток

Саму программу выложу вечером.

Алгоритм следующий:
Передатчик
1. С использованием Vision берем видео поток и выделяем текущий кадр.
2. Преобразуем в String.
3. Маркируем начало и конец видео кадра ([start]...[end]).
4. Разбиваем на пакеты длиной 8192 byte.
5. Отправляем пакеты.

Приемник
1. Принимаем пакет.
2. Если в нем присутствует метка [start], то записываем все что после метки в String.
3. Все последующие пакеты так же пишем в String, пока не встретится пакет содержащий метку [end], соответственно пишем все что до [end].
4. Полученный String преобразуем в видео кадр и отображаем.

При работе на одном ПК (lacalhost), все передается нормально.
При работе на разных ПК в локальной сети (10 MBit) в течении минуты, не было принято нормально ни одного кадра.

На память....
Разрешение видео 320*240 - 15 fps. (уточню вечером)

Я понимаю все недостатки протокола UDP, но реализовать необходимо именно его.
Может кто-то делал подобное, готов выслушать рекомендации и принять любую помощь.
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: Передача видео потока по UDP

Сообщение Pavel Krivozubov »

Я делал подобное, но на TCP/IP. Проблем не было.
А на UDP - я бы начал с того, что исследовал бы вообще корректно ли он работает в вашей сети.
Начал бы с передачи строки, потом усложнял и увеличивал бы посылку, чтобы посмотреть на каком шаге трапается.
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Передача видео потока по UDP

Сообщение Sergey Ivanov »

4. Разбиваем на пакеты длиной 8192 byte.
а если на более "короткие" пакеты попробовать разбить ?
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5458
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Re: Передача видео потока по UDP

Сообщение IvanLis »

Pavel Krivozubov писал(а):А на UDP - я бы начал с того, что исследовал бы вообще корректно ли он работает в вашей сети.
Начал бы с передачи строки, потом усложнял и увеличивал бы посылку, чтобы посмотреть на каком шаге трапается.
Передача небольших данных идет корректно.

В принципе она и делалась в первую очередь не для организации передачи видео, а именно "исследования возможности протокола UDP в качестве транспорта видео потока".
Поэкспериментировать времени не было.
Возникает ошибка именно при преобразовании String -> Image, видимо из-за нарушения целостности данных.
Т.к. сам протокол UDP не гарантирует правильную доставку, к тому же может нарушаться очередность обработки пакетов на приеме.
Sergey Ivanov писал(а):а если на более "короткие" пакеты попробовать разбить ?
между отсылкой пакетов приходится делать паузу, иначе возникает ошибка
если разбить на большее кол-во пакетов, то просто можно не успеть передать кадр
да и чисто теоретически, чем длиннее пакет, тем выше информационная скорость, т.к. изменяется соотношение "информация"/"служебная информация"

Может у кого есть реализованные алгоритмы сжатия или помехоустойчивого кодирования?
Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1729
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Благодарил (а): 1 раз
Контактная информация:

Re: Передача видео потока по UDP

Сообщение Jakob Brontfeyn »

Может вдруг это окажется полезным.
Вот в этой теме первоначально была цель стыковать LV разных версий
на одном компьютере, но потом проверял передачу по сети, между разными
компьютерами работало без сбоев, посмотри.
http://www.labviewportal.org/viewtopic. ... 933#p25748

PS. не хочу предлагать перекачивать, не весь кадр, а только изменения в нем,
используя сдвиговый регистр и операцию ХOR, можно залезть так, что и не вылезешь потом..., попробуй ???
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1326
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 36 раз
Контактная информация:

Re: Передача видео потока по UDP

Сообщение AndreyDmitriev »

IvanLis писал(а): Может у кого есть реализованные алгоритмы сжатия или помехоустойчивого кодирования?
Ну самое простое, что приходит в голову - жать каждый кадр JPEG, передавать его упакованным, и распаковывать на стороне клиента. При умеренных размерах картинок и достаточно быстрых компьютерах скорости должно хватить и для передачи в реальном времени. Это резко уменьшит поток данных и пропуск пакетов будет не так критичен. Если в одном фрейме будет несколько пакетов и один из них будет пропущен, то при распаковке само собой будет ошибка - такой фрейм придётся отбрасывать целиком (возможно, при достаточной компрессии удастся уложить один кадр в один пакет). Передачу в JPEG можно организовать средствами LabVIEW, хотя есть одна маленькая тонкость - касающаяся преобразования JPEG строки обратно в IMAQ Image. Об этом можно вот здесь почитать:
Convert JPEG image in memory to Imaq Image
Совсем уж высший пилотаж - кодировать MJPEG, но встроенных средств тут уже не хватит - придётся задействовать сторонние библиотеки (ну, скажем, интеловские - там есть всё необходимое), кроме того придётся научиться обрабатывать ситуацию пропуска опорных кадров.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5458
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Re: Передача видео потока по UDP

Сообщение IvanLis »

AndreyDmitriev писал(а):Ну самое простое, что приходит в голову - жать каждый кадр JPEG, передавать его упакованным, и распаковывать на стороне клиента.
Высшим пилотажем заниматься некогда :D .
По поводу Jpeg думал, но не нашел обратного преобразования, а интернет под руками не было.
Нашел практически, то что нужно: Transfer Images Over the Network

Собственно сама программа:
Video-Ivan-Client.vi
lv2010
(51.31 КБ) 456 скачиваний
Video-Ivan-Server.vi
lv2010
(51.79 КБ) 422 скачивания
Изображение 320*240 - 15 fps.
Кадр = 330865 Byte
Итого имеем 40 пакетов.

Попробую Jpeg, может еще что найду. По результатам отпишусь.

Может есть приметы компрессии/декомпрессии с использованием алгоритмов LZW или gZIP (Deflate).
То что есть в :labview: ZIP работает видимо только с файлами.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1326
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 36 раз
Контактная информация:

Re: Передача видео потока по UDP

Сообщение AndreyDmitriev »

IvanLis писал(а): Может есть приметы компрессии/декомпрессии с использованием алгоритмов LZW или gZIP (Deflate).
То что есть в :labview: ZIP работает видимо только с файлами.
Есть в OpenG - работает со строковыми данными. Но для компрессии изображений плохо подходит, так что можно не заморачиваться - там выигрыш процентов 20-30 в лучшем случае (если только картинки не бинарные).
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5458
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Re: Передача видео потока по UDP

Сообщение IvanLis »

IvanLis писал(а):По поводу Jpeg думал, но не нашел обратного преобразования, а интернет под руками не было.
Чего-то я не совсем догоняю, но вот результаты.
Video-Ivan-Client-Jpeg.vi
lv2010
(54.99 КБ) 317 скачиваний
Video-Ivan-Server-Jpeg.vi
lv2010
(52.65 КБ) 299 скачиваний
С Jpeg сжатием все понятно, так что при качестве 750 легко укладываемся в два пакета, а при 500 в один (качества достаточно). С сжатием проблема решена!

Проблемы с приемом, точнее с приемом тоже проблемы закончились, т.к. кадр передается в одном пакете. Но метки [start] и [end] я на всякий случай оставил :D . В принципе и при передаче кадра за 5 пакетов ошибки при преобразовании не возникает.
Приемник видео потока
Приемник видео потока
Чудеса....
1. Так как обратного преобразования, я решил использовать обычное преобразование String->Image. И самое удивительное, что заработало. Ну... подумалось, что все на столько умно, что LabVIEW определяет сжатую инфу и самостоятельно преобразует. Но это было при работе на localhost.
2. Попробовал сохранить кадр Image -> Jpeg String в текстовый файл. Вроде открывается, но уже с искажениями....
3. При работе по сети. Видно, что кадр принимается нормально. Преобразование Jpeg String -> Image производится без ошибок. Но при этом на индикаторе Image ничего не отображается, что в принципе менее удивительно, чем п.1.

Попробовать варианты преобразования предложенные по ссылкам выше было некогда.
Не могу понять, почему при работе через локальный порт все нормально, а при передаче на другой ПК, результат отрицательный?
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: Передача видео потока по UDP

Сообщение mzu2006 »

Посмотрел на код клиента. Дело, мне кажется, вот в чем. ядро IMAQ независимо от :vi: . Т.е. для разных :vi: на одной машине происходит доступ к одному и тому же набору изображений. Когда ты делаешь flatten to string, то в полученную строку сохраняются ещё и внутренние переменные IMAQ. Потом, когда ты делаешь unflatten, то на одной и той же машине доступ происходит к одному и тому же набору изображений, лежащему по тем же самым адресам в памяти. А на другой машине доступ просто не возможен как раз на этапе unflatten, когда :labview: пытается вписать данные из структуры image, в структуру Image живущую на другой машинке (Иные внутренние параметры).
Что же делать? Получать строчку из Image вот так:
Image2String.png
Image2String.png (48.02 КБ) 16332 просмотра
И потом симметрично вставлять полученную строчку уже в новое изображение на удаленной машине.
Вложения
Image2String.vi
(38.04 КБ) 271 скачивание
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5458
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Re: Передача видео потока по UDP

Сообщение IvanLis »

mzu2006 писал(а):Т.е. для разных :vi: на одной машине происходит доступ к одному и тому же набору изображений. Когда ты делаешь flatten to string, то в полученную строку сохраняются ещё и внутренние переменные IMAQ. Потом, когда ты делаешь unflatten, то на одной и той же машине доступ происходит к одному и тому же набору изображений, лежащему по тем же самым адресам в памяти.
Я тоже об этом думал, специально при создании указал различные имена.
Но видимо так оно и есть.

Попробовать Ваши предложения нет возможности.
Но боюсь опять возникнут проблемы с большим кол-вом пакетов, т.к. здесь не используется сжатие.

Все таки хочется использовать предварительное сжатие Jpeg.
IMAQ Flatten Image to String VI
Help писал(а):Data String is the LabVIEW string containing the string representation of the image. Use the Unflatten from String LabVIEW primitive to convert this string back to an image. If an image has the same name as the flattened image in memory, when the string is unflattened, the contents of the flattened image string are copied to the image. Otherwise, a new image with a unique name is created that contains the contents of the flattened image string.
Судя по описанию, Data - строковое представление изображения.
То для обратного преобразования необходимо использовать функцию Unflatten from String. И если имя изображения (Unflatten Image) совпадает с Flatten Image, то изображение перезаписывается. Иначе создается новое изображение, которое соответствует Flatten Image to String... :dntknw:

Короче, я сохранил в txt файл несколько кадров обработанных функцией IMAQ Flatten Image to String VI с сжатием/без сжатия и содержащие информацию Image and Vision Info/Image.
Название файла соответствует содержащейся информации.
NEW jpeg-300 (Image).txt
(4.11 КБ) 282 скачивания
NEW jpeg-300 (Image and Vision Info).txt
(4 КБ) 261 скачивание

Помогите восстановить из этих данных изображения. :thank:
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1326
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 36 раз
Контактная информация:

Re: Передача видео потока по UDP

Сообщение AndreyDmitriev »

IvanLis писал(а): Помогите восстановить из этих данных изображения. :thank:
restorator.png
restorator.png (3.26 КБ) 16258 просмотров
Да без проблем. Кстати, коллега IvanLis, текстовые файлы не очень подходят для хранения двоичной информации. Там везде 0x0A заменилось на 0x0D 0x0A отсюда и проблемы. И имеет смысл до конца разобраться с Flatten/Unflatten.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1326
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 36 раз
Контактная информация:

Re: Передача видео потока по UDP

Сообщение AndreyDmitriev »

mzu2006 писал(а):Посмотрел на код клиента. Дело, мне кажется, вот в чем. ядро IMAQ независимо от :vi: . Т.е. для разных :vi: на одной машине происходит доступ к одному и тому же набору изображений. Когда ты делаешь flatten to string, то в полученную строку сохраняются ещё и внутренние переменные IMAQ. Потом, когда ты делаешь unflatten, то на одной и той же машине доступ происходит к одному и тому же набору изображений, лежащему по тем же самым адресам в памяти. А на другой машине доступ просто не возможен как раз на этапе unflatten, когда :labview: пытается вписать данные из структуры image, в структуру Image живущую на другой машинке (Иные внутренние параметры).
Что же делать? Получать строчку из Image вот так:
Image2String.png
И потом симметрично вставлять полученную строчку уже в новое изображение на удаленной машине.
Коллега mzu2006, Вы учите коллегу IvanLisа плохому. Не надо так делать. Flatten/Unflatten прекрасно работают в паре. А в последних версиях можно указать Flatten не тащить за собой оригинальной имя (Flatten with Process-Unique Name (F)), а Unflatten достаточно интеллигентна, чтобы внутри вызвать IMAQ Create для резервирования памяти под картинку.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5458
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Re: Передача видео потока по UDP

Сообщение IvanLis »

AndreyDmitriev писал(а):Да без проблем. Кстати, коллега IvanLis, текстовые файлы не очень подходят для хранения двоичной информации. Там везде 0x0A заменилось на 0x0D 0x0A отсюда и проблемы. И имеет смысл до конца разобраться с Flatten/Unflatten.
Я не для хранения делал, а для эксперимента.
В файл сохранил, то что передается на другой ПК. А передается String.
Если у Вас получилось восстановить, то и у меня должно заработать.

:dntknw: да и пробовал я, только тип определял по другому немного
вот так
вот так
Open Jpeg.png (2.67 КБ) 16300 просмотров
на типы данных не обращайте внимания, скриншот делал на Linux, он про IMAQ и не слышал

По поводу разобраться... согласен. Но не всегда время есть.

В любом случае спасибо :thank:
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1326
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 36 раз
Контактная информация:

Re: Передача видео потока по UDP

Сообщение AndreyDmitriev »

IvanLis писал(а): В файл сохранил, то что передается на другой ПК. А передается String.
Ну строка в данном случае содержит двоичные данные. Вот смотрите, там по умолчанию Convert EOL установлен:
scr.png
scr.png (7.44 КБ) 16290 просмотров
А это приводит к тому, что на самом деле в выходной файл запишется несколько не то, что изначально содержалось в строке (там будет не три байта, а четыре). При загрузке происходит обратная конвертация, но не для любого набора данных она будет происходить правильно. А правильно пользоваться парой Write Binary File / Read Binary File (именно для строки) - тогда проблем не будет.
IvanLis писал(а): :dntknw: да и пробовал я, только тип определял по другому немного
Вложение Open Jpeg.png больше недоступно
на типы данных не обращайте внимания, скриншот делал на Linux, он про IMAQ и не слышал
Это по сути тоже самое. Но вызов IMAQ Create собственно не нужен - константы достаточно, потому что IMAQ Create будет вызван при Unflatten автоматически, причём с тем именем, которое пришло в заголовке из входной строки
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Vision / IMAQ»