Передача видео потока по UDP
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Передача видео потока по UDP
Передача видео потока по 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, но реализовать необходимо именно его.
Может кто-то делал подобное, готов выслушать рекомендации и принять любую помощь.
на днях пришлось делать программу, точнее пару
первая из них осуществляет захват видео потока с 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, но реализовать необходимо именно его.
Может кто-то делал подобное, готов выслушать рекомендации и принять любую помощь.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
Pavel Krivozubov
- professor
- Сообщения: 4422
- Зарегистрирован: 07 фев 2008, 16:39
- Награды: 3
- Версия LabVIEW: 7.0 - 2013
- Откуда: г. Электросталь
- Благодарил (а): 24 раза
- Поблагодарили: 9 раз
- Контактная информация:
Re: Передача видео потока по UDP
Я делал подобное, но на TCP/IP. Проблем не было.
А на UDP - я бы начал с того, что исследовал бы вообще корректно ли он работает в вашей сети.
Начал бы с передачи строки, потом усложнял и увеличивал бы посылку, чтобы посмотреть на каком шаге трапается.
А на UDP - я бы начал с того, что исследовал бы вообще корректно ли он работает в вашей сети.
Начал бы с передачи строки, потом усложнял и увеличивал бы посылку, чтобы посмотреть на каком шаге трапается.
Правила форума
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
-
Sergey Ivanov
- expert
- Сообщения: 1217
- Зарегистрирован: 01 мар 2009, 20:54
- Награды: 5
- Версия LabVIEW: 2018
- Откуда: Санкт-Петербург, Кронштадт
- Благодарил (а): 11 раз
- Поблагодарили: 1 раз
- Контактная информация:
Re: Передача видео потока по UDP
а если на более "короткие" пакеты попробовать разбить ?4. Разбиваем на пакеты длиной 8192 byte.
Добро пожаловать на http://rk-stud.ru/
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Передача видео потока по UDP
Передача небольших данных идет корректно.Pavel Krivozubov писал(а):А на UDP - я бы начал с того, что исследовал бы вообще корректно ли он работает в вашей сети.
Начал бы с передачи строки, потом усложнял и увеличивал бы посылку, чтобы посмотреть на каком шаге трапается.
В принципе она и делалась в первую очередь не для организации передачи видео, а именно "исследования возможности протокола UDP в качестве транспорта видео потока".
Поэкспериментировать времени не было.
Возникает ошибка именно при преобразовании String -> Image, видимо из-за нарушения целостности данных.
Т.к. сам протокол UDP не гарантирует правильную доставку, к тому же может нарушаться очередность обработки пакетов на приеме.
между отсылкой пакетов приходится делать паузу, иначе возникает ошибкаSergey Ivanov писал(а):а если на более "короткие" пакеты попробовать разбить ?
если разбить на большее кол-во пакетов, то просто можно не успеть передать кадр
да и чисто теоретически, чем длиннее пакет, тем выше информационная скорость, т.к. изменяется соотношение "информация"/"служебная информация"
Может у кого есть реализованные алгоритмы сжатия или помехоустойчивого кодирования?
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
Jakob Brontfeyn
- expert
- Сообщения: 1729
- Зарегистрирован: 28 фев 2008, 11:01
- Награды: 6
- Благодарил (а): 1 раз
- Контактная информация:
Re: Передача видео потока по UDP
Может вдруг это окажется полезным.
Вот в этой теме первоначально была цель стыковать LV разных версий
на одном компьютере, но потом проверял передачу по сети, между разными
компьютерами работало без сбоев, посмотри.
http://www.labviewportal.org/viewtopic. ... 933#p25748
PS. не хочу предлагать перекачивать, не весь кадр, а только изменения в нем,
используя сдвиговый регистр и операцию ХOR, можно залезть так, что и не вылезешь потом..., попробуй ???
Вот в этой теме первоначально была цель стыковать LV разных версий
на одном компьютере, но потом проверял передачу по сети, между разными
компьютерами работало без сбоев, посмотри.
http://www.labviewportal.org/viewtopic. ... 933#p25748
PS. не хочу предлагать перекачивать, не весь кадр, а только изменения в нем,
используя сдвиговый регистр и операцию ХOR, можно залезть так, что и не вылезешь потом..., попробуй ???
-
- VIP
- Сообщения: 1338
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 44 раза
- Контактная информация:
Re: Передача видео потока по UDP
Ну самое простое, что приходит в голову - жать каждый кадр JPEG, передавать его упакованным, и распаковывать на стороне клиента. При умеренных размерах картинок и достаточно быстрых компьютерах скорости должно хватить и для передачи в реальном времени. Это резко уменьшит поток данных и пропуск пакетов будет не так критичен. Если в одном фрейме будет несколько пакетов и один из них будет пропущен, то при распаковке само собой будет ошибка - такой фрейм придётся отбрасывать целиком (возможно, при достаточной компрессии удастся уложить один кадр в один пакет). Передачу в JPEG можно организовать средствами LabVIEW, хотя есть одна маленькая тонкость - касающаяся преобразования JPEG строки обратно в IMAQ Image. Об этом можно вот здесь почитать:IvanLis писал(а): Может у кого есть реализованные алгоритмы сжатия или помехоустойчивого кодирования?
Convert JPEG image in memory to Imaq Image
Совсем уж высший пилотаж - кодировать MJPEG, но встроенных средств тут уже не хватит - придётся задействовать сторонние библиотеки (ну, скажем, интеловские - там есть всё необходимое), кроме того придётся научиться обрабатывать ситуацию пропуска опорных кадров.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Передача видео потока по UDP
Высшим пилотажем заниматься некогда .AndreyDmitriev писал(а):Ну самое простое, что приходит в голову - жать каждый кадр JPEG, передавать его упакованным, и распаковывать на стороне клиента.
По поводу Jpeg думал, но не нашел обратного преобразования, а интернет под руками не было.
Нашел практически, то что нужно: Transfer Images Over the Network
Собственно сама программа: Изображение 320*240 - 15 fps.
Кадр = 330865 Byte
Итого имеем 40 пакетов.
Попробую Jpeg, может еще что найду. По результатам отпишусь.
Может есть приметы компрессии/декомпрессии с использованием алгоритмов LZW или gZIP (Deflate).
То что есть в ZIP работает видимо только с файлами.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- VIP
- Сообщения: 1338
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 44 раза
- Контактная информация:
Re: Передача видео потока по UDP
Есть в OpenG - работает со строковыми данными. Но для компрессии изображений плохо подходит, так что можно не заморачиваться - там выигрыш процентов 20-30 в лучшем случае (если только картинки не бинарные).IvanLis писал(а): Может есть приметы компрессии/декомпрессии с использованием алгоритмов LZW или gZIP (Deflate).
То что есть в ZIP работает видимо только с файлами.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Передача видео потока по UDP
Чего-то я не совсем догоняю, но вот результаты. С Jpeg сжатием все понятно, так что при качестве 750 легко укладываемся в два пакета, а при 500 в один (качества достаточно). С сжатием проблема решена!IvanLis писал(а):По поводу Jpeg думал, но не нашел обратного преобразования, а интернет под руками не было.
Проблемы с приемом, точнее с приемом тоже проблемы закончились, т.к. кадр передается в одном пакете. Но метки [start] и [end] я на всякий случай оставил . В принципе и при передаче кадра за 5 пакетов ошибки при преобразовании не возникает.
Чудеса....
1. Так как обратного преобразования, я решил использовать обычное преобразование String->Image. И самое удивительное, что заработало. Ну... подумалось, что все на столько умно, что LabVIEW определяет сжатую инфу и самостоятельно преобразует. Но это было при работе на localhost.
2. Попробовал сохранить кадр Image -> Jpeg String в текстовый файл. Вроде открывается, но уже с искажениями....
3. При работе по сети. Видно, что кадр принимается нормально. Преобразование Jpeg String -> Image производится без ошибок. Но при этом на индикаторе Image ничего не отображается, что в принципе менее удивительно, чем п.1.
Попробовать варианты преобразования предложенные по ссылкам выше было некогда.
Не могу понять, почему при работе через локальный порт все нормально, а при передаче на другой ПК, результат отрицательный?
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: Передача видео потока по UDP
Посмотрел на код клиента. Дело, мне кажется, вот в чем. ядро IMAQ независимо от . Т.е. для разных на одной машине происходит доступ к одному и тому же набору изображений. Когда ты делаешь flatten to string, то в полученную строку сохраняются ещё и внутренние переменные IMAQ. Потом, когда ты делаешь unflatten, то на одной и той же машине доступ происходит к одному и тому же набору изображений, лежащему по тем же самым адресам в памяти. А на другой машине доступ просто не возможен как раз на этапе unflatten, когда пытается вписать данные из структуры image, в структуру Image живущую на другой машинке (Иные внутренние параметры).
Что же делать? Получать строчку из Image вот так: И потом симметрично вставлять полученную строчку уже в новое изображение на удаленной машине.
Что же делать? Получать строчку из Image вот так: И потом симметрично вставлять полученную строчку уже в новое изображение на удаленной машине.
- Вложения
-
- Image2String.vi
- (38.04 КБ) 272 скачивания
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Передача видео потока по UDP
Я тоже об этом думал, специально при создании указал различные имена.mzu2006 писал(а):Т.е. для разных на одной машине происходит доступ к одному и тому же набору изображений. Когда ты делаешь flatten to string, то в полученную строку сохраняются ещё и внутренние переменные IMAQ. Потом, когда ты делаешь unflatten, то на одной и той же машине доступ происходит к одному и тому же набору изображений, лежащему по тем же самым адресам в памяти.
Но видимо так оно и есть.
Попробовать Ваши предложения нет возможности.
Но боюсь опять возникнут проблемы с большим кол-вом пакетов, т.к. здесь не используется сжатие.
Все таки хочется использовать предварительное сжатие Jpeg.
IMAQ Flatten Image to String VI
Судя по описанию, Data - строковое представление изображения.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.
То для обратного преобразования необходимо использовать функцию Unflatten from String. И если имя изображения (Unflatten Image) совпадает с Flatten Image, то изображение перезаписывается. Иначе создается новое изображение, которое соответствует Flatten Image to String...
Короче, я сохранил в txt файл несколько кадров обработанных функцией IMAQ Flatten Image to String VI с сжатием/без сжатия и содержащие информацию Image and Vision Info/Image.
Название файла соответствует содержащейся информации.
Помогите восстановить из этих данных изображения.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- VIP
- Сообщения: 1338
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 44 раза
- Контактная информация:
Re: Передача видео потока по UDP
Да без проблем. Кстати, коллега IvanLis, текстовые файлы не очень подходят для хранения двоичной информации. Там везде 0x0A заменилось на 0x0D 0x0A отсюда и проблемы. И имеет смысл до конца разобраться с Flatten/Unflatten.IvanLis писал(а): Помогите восстановить из этих данных изображения.
-
- VIP
- Сообщения: 1338
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 44 раза
- Контактная информация:
Re: Передача видео потока по UDP
Коллега mzu2006, Вы учите коллегу IvanLisа плохому. Не надо так делать. Flatten/Unflatten прекрасно работают в паре. А в последних версиях можно указать Flatten не тащить за собой оригинальной имя (Flatten with Process-Unique Name (F)), а Unflatten достаточно интеллигентна, чтобы внутри вызвать IMAQ Create для резервирования памяти под картинку.mzu2006 писал(а):Посмотрел на код клиента. Дело, мне кажется, вот в чем. ядро IMAQ независимо от . Т.е. для разных на одной машине происходит доступ к одному и тому же набору изображений. Когда ты делаешь flatten to string, то в полученную строку сохраняются ещё и внутренние переменные IMAQ. Потом, когда ты делаешь unflatten, то на одной и той же машине доступ происходит к одному и тому же набору изображений, лежащему по тем же самым адресам в памяти. А на другой машине доступ просто не возможен как раз на этапе unflatten, когда пытается вписать данные из структуры image, в структуру Image живущую на другой машинке (Иные внутренние параметры).
Что же делать? Получать строчку из Image вот так: И потом симметрично вставлять полученную строчку уже в новое изображение на удаленной машине.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Передача видео потока по UDP
Я не для хранения делал, а для эксперимента.AndreyDmitriev писал(а):Да без проблем. Кстати, коллега IvanLis, текстовые файлы не очень подходят для хранения двоичной информации. Там везде 0x0A заменилось на 0x0D 0x0A отсюда и проблемы. И имеет смысл до конца разобраться с Flatten/Unflatten.
В файл сохранил, то что передается на другой ПК. А передается String.
Если у Вас получилось восстановить, то и у меня должно заработать.
да и пробовал я, только тип определял по другому немного на типы данных не обращайте внимания, скриншот делал на Linux, он про IMAQ и не слышал
По поводу разобраться... согласен. Но не всегда время есть.
В любом случае спасибо
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- VIP
- Сообщения: 1338
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 44 раза
- Контактная информация:
Re: Передача видео потока по UDP
Ну строка в данном случае содержит двоичные данные. Вот смотрите, там по умолчанию Convert EOL установлен: А это приводит к тому, что на самом деле в выходной файл запишется несколько не то, что изначально содержалось в строке (там будет не три байта, а четыре). При загрузке происходит обратная конвертация, но не для любого набора данных она будет происходить правильно. А правильно пользоваться парой Write Binary File / Read Binary File (именно для строки) - тогда проблем не будет.IvanLis писал(а): В файл сохранил, то что передается на другой ПК. А передается String.
Это по сути тоже самое. Но вызов IMAQ Create собственно не нужен - константы достаточно, потому что IMAQ Create будет вызван при Unflatten автоматически, причём с тем именем, которое пришло в заголовке из входной строкиIvanLis писал(а): да и пробовал я, только тип определял по другому немногона типы данных не обращайте внимания, скриншот делал на Linux, он про IMAQ и не слышал
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 13 Ответы
- 2455 Просмотры
-
Последнее сообщение rsv