Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > Помогите грамотно перенаправить видео через netcat


Автор: quiz 13.1.2014, 22:04
Всех приветствую!
С линуксом знаком только поверхностно, поэтому заранее прошу прощения за возможно неверную терминологию.

Имеется автономно установленный мини-ПК raspberry pi с модулем камеры и WiFi-адаптером, который настроен на работу в составе Ad-hoc сети.
Необходимо иметь возможность в любой момент времени подключиться к нему с одного единственного компьютера и посмотреть видео-поток.

Для работы с камерой к мини-ПК прилагается утилита raspivid, которая работает без проблем и умеет перенаправлять видео-поток на stdout. Этот поток так же без проблем транслируется на конкретный IP командой вроде:
Код
raspivid -t 9999 -o - | nc 192.168.1.10 5555


Однако на приемной стороне должен быть запущен NetCat (или любой другой сервер) в режиме ожидания входящих соединений, в противном случае эта связка просто завершает работу. Было бы идеально, чтобы этот поток постоянно транслировался "в никуда", пока в сети нет принимающей стороны. Однако таких вариантов в параметрах netcat я не нашел. Может быть это можно реализовать другой утилитой?

Второй вариант - запустить сервер netcat на передающей стороне и подключаться при необходимости. Запуск реализуется следующим образом:
Код
raspivid -t 9999 -o - | nc -vv -l -k -p 5555


Такой вариант тоже работает, но только если запустить сервер и сразу же к нему подключиться, забирая данные. Если сервер стоит без коннекта извне, то через 10 секунд программа захвата подвисает. Видимо видео-поток, который никто не забирает, как-то забивает "stdout".

Подскажите, как грамотнее выйти из данной ситуации. Можно конечно запускать передачу видео какой-то командой со стороны клиента после соединения, но как-то это криво что-ли.  smile 

Автор: tzirechnoy 14.1.2014, 01:00
Ну, впишы команду raspivid в inetd.con/xinetd.conf.d (что-то там должно быть вместо inetd в этом raspberry linux).

Но вообще, подводных камней с разделением/рестартом там хватит -- а для видеостриминга есть спецыально написанные серверы -- icecast, vlc, erlyvideo (этот великоват для embedded, я подозреваю), mjpg-streamer, motion, ffmpeg -- можэт, на них посмотреть? 

Автор: shgurbanov 14.1.2014, 22:11
Как упомнул коллега, vlc идеальный вариант.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Помогите-грамотно-перенаправить-видео-через-netcat-id52d4391dae201507418b4567#findElement_E7045_52d58bd9ae20150b6c304f11_0

Автор: quiz 15.1.2014, 12:02
Спасибо, что не оставили мою проблему без внимания.

Вариант с vlc я попробовал в первую очередь, и результат оказался неудовлетворительным. FullHD видео на приемной стороне принимается с задержкой в 2-3 секунды и больше, а через пару десятков секунд начинаются дергания и совсем дикие задержки (возможно недостаточно производительности раздающего мини-ПК). И это при подключении к другому компьютеру напрямую по сетевому кабелю.

При раздаче через netcat, после подбора грамотных настроек потока на приемной и передающей сторонах, 1080p видео принимается практически в реал-тайме. И загрузка ЦП Raspberry минимальна, что-то в районе 8-10%.

Автор: quiz 17.1.2014, 21:46
Засунул на передающей стороне запуск стриминга через netcat в бесконечный цикл и все казалось бы хорошо, цикл "долбит" команду, netcat не находит приемную сторону, выходит и все начинается по-новой. В нужный момент приемный компьютер соединяется, запускает у себя сервер и начинается вещание. Приемный компьютер выключает сервер, передатчик начинает снова долбить цикл в ожидании принимающей стороны.
Однако уже ранее замеченная проблема возникает при неустойчивом коннекте. NetCat шлет данные на ip адрес, который вроде как есть, а данные не доходят. И через несколько секунд вся эта задумка подвисает, видимо опять из-за большой кучи данных, накопившихся в stdout. Причем именно подвисает, а не просто завершает выполнение, дабы вернуться к циклу.

Может все-таки есть какие-то способы контролировать эти накапливающиеся при плохой связи данные? Может быть есть какая-то утилита типа netcat, но более гибкая?

Автор: tzirechnoy 17.1.2014, 22:39
Цитата
Засунул на передающей стороне запуск стриминга через netcat в бесконечный цикл


То есть прочесть первую строку моего ответа у Вас не получилось.

Цитата
Может все-таки есть какие-то способы контролировать эти накапливающиеся при плохой связи данные? Может быть есть какая-то утилита типа netcat, но более гибкая? 



Конечно, есть. icecast, vlc, erlyvideo (этот великоват для embedded, я подозреваю), mjpg-streamer, motion, ffmpeg, и пр.

Автор: quiz 20.1.2014, 23:58
С этими видео-серверами ничего толкового не вышло. Оно и логично, железо слишком слабое, да и не нужны они вовсе для раздачи с одного компьютера на другой.
Решил проблему через socat

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)