Raspberry Pi 3 и CSI камера. Cтриминг как клиент, через netcat и mplayer

Тема в разделе "Raspberry Pi", создана пользователем Sanchez5890, 17 июн 2019.

  1. Sanchez5890

    Sanchez5890 Нерд

    Доброго времени суток форум! Можете, пожалуйста, подсказать как решить проблему? Есть Raspberry Pi 3, CSI камера v2, мощный компьютер с Ubuntu. Хочу открыть сервер на компьютере и принимать с малины видео (стрим) с CSI камеры, да так чтобы малина была клиентом, а компьютер - сервером. Я хочу это сделать именно так, потому что впоследствии малина будет снабжена 4g модемом и аккумулятором и будет автономна. Я хотел бы вас спросить, как это можно реализовать, например через сокеты? Я уже пробовал запускать стриминг через netcat и mplayer, и как я уже говорил это делает малину сервером :-(. Помогите, пожалуйста, понять, как можно это реализовать.
     
  2. А вы man netcat читали? Он и клиентом работать умеет.
     
  3. Sanchez5890

    Sanchez5890 Нерд

    Спасибо, сейчас посмотрим что там есть
     
  4. Sanchez5890

    Sanchez5890 Нерд

    C netcat всё оказывается просто, достаточно указать только ip сервера.
    Код (Text):
    $ nc [ip] [port]
    Тогда я теперь задаюсь вопросом, что с сервером?
    Мои предположение - открыть сервер тоже на netcat и потом подконектиться через mplayer. я сейчас так и попробовал. Либо я криворук, либо это действительно не работает. Есть соединение сервера и клиента, да только mplayer подключаться не хочет
    Код (Text):
    do_connect: could not connect to socket
    connect: No such file or directory
    Failed to open LIRC support. You will not be able to use your remote control.

    Playing ffmpeg://tcp://192.168.1.200:2222.
    libavformat version 57.83.100 (external)
    H264-ES file format detected.
    Video: Cannot read properties.
    No stream found.
     
     
  5. Всё может быть. Вы ждете, что кто-то угадает, что вы там сделали?
     
  6. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Простите за вмешатольство. Подсказали мне, или наткнулся... по моему Алекс совет давал.
    Посмотрите на socat это достойная замена, вплоть до удлинения serial порта и др. по сокету.
     
  7. Sanchez5890

    Sanchez5890 Нерд

    Спасибо сейчас гляну
     
  8. Sanchez5890

    Sanchez5890 Нерд

    Я в такой небольшой безысходности, несовсем понятно что нужно для достижения желаемого результата. Я могу сделать малину клиентом, через netcat, как я уже сказал раньше, и могу сделать сервером главный компьютер и даже получить трансляцию, выглядит это конечно вот так:
    Код (Text):
                                   �]�z����Q9G�$O
    �p���y�_�]�ˑ)�՛eM�W�r��=�.2�,ۀ�٣L�Jv=z    �`��W\��]�<\.ZH��8��^�ϔ�8�eE=��bw(R�7���PN� J�OX�n�&�ґ2�Z��2%Z��T�BaM�̼���o�$ܼqs�l�y�<���e@b�:!�?ڛ�f��4�����
                                                             C{q�x1��3Y�<k�l7�LP������<s�J�{�+Lvh�_���=jD;��)9�dJ�J    �"�)�Ѭ>�['ʙU�>$����
    �6H��VQl$�����u)b�Y��6����v�r��`�g     �
    e���8�3��E�����=j�y             1i
                          ��5�zN�6l��V2�v�Ǩh��R��g�p���P{�"��tN���Yfp�
                                                                         ��|�Ӈ}r�W
                                                                                   |4�I�>"#���.WL�q-��f�Y9g�w��O�S%�S��e\i,e
     
    Я позволю предположить, что нужно как-то всё это чудо прочитать например, через mplayer. Тогда, там нужно настроить netcat или socat так, чтобы он мог принимать сразу два клиента? Вы согласны со мной? Заранее всем большое спасибо
     
  9. Sanchez5890

    Sanchez5890 Нерд

    Вот у меня появился ещё вопрос, возможно ли всё это поместить в скетч python? Используя библиотеки socket и pycamera или какие нибудь другие библиотеки?
     
  10. Igor68

    Igor68 Гуру

    посмотрите возможность fork для socat
    https://stackoverflow.com/questions/29739901/socat-fake-http-server-use-a-file-as-server-response
    https://linux-notes.org/ustanovka-socat-v-unix-linux/
    https://github.com/craSH/socat/blob/master/EXAMPLES
    и др.
    Вот:
    Код (Text):
    socat tcp-l:8080,reuseaddr,fork proxy:192.168.0.240:192.168.0.234:80,proxyport=8080,proxyauth=www-data:www-data
    Нормально выполняет функцию прокси. В данном случае прослушивает порт, удерживает имеющиеся соединения, и принимает новые. Делает дополнительные процессы для каждого подключения.
    В этом примере устройство с IP 192.168.0.240 прослушивает порт 8080, и при подключении к нему производит проброс соединения на IP 192.168.0.234
    Наверное для данного случая не удачный пример.
     
  11. Igor68

    Igor68 Гуру

    А вот это:
    Код (Text):
    socat tcp-l:8383,fork tcp-connect:192.168.0.234:80
    на устройстве прослушивает порт 8383 и работая сервером перенаправляет весь обмен через себя на адрес 192.168.0.234 порт 80 (сервер apache) - связь двухсторонняя.
    В этом примере к одной странице подключены два PC через устройство.
    Вот:
    Код (Text):
    www-data@Moxa:~$ netstat -nlta
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State    
    tcp        0      0 0.0.0.0:9               0.0.0.0:*               LISTEN    
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN    
    tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN    
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN    
    tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN    
    tcp        0      0 0.0.0.0:8383            0.0.0.0:*               LISTEN    
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50557     ESTABLISHED
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50553     TIME_WAIT
    tcp        0      0 192.168.0.240:8383      192.168.0.100:58243     ESTABLISHED
    tcp        0      0 192.168.0.240:8383      192.168.0.100:58247     ESTABLISHED
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50561     ESTABLISHED
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50556     ESTABLISHED
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50552     TIME_WAIT
    tcp        0      0 192.168.0.240:8383      192.168.0.100:58242     ESTABLISHED
    tcp        0      0 192.168.0.240:8383      192.168.0.100:58246     ESTABLISHED
    tcp        0      0 192.168.0.240:22        192.168.0.100:52530     ESTABLISHED                                                                                                              
    tcp        0      0 192.168.0.240:22        192.168.0.237:56844     ESTABLISHED                                                                                                              
    tcp        0      0 192.168.0.240:22        192.168.0.237:56831     ESTABLISHED                                                                                                              
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50551     TIME_WAIT                                                                                                                
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50559     ESTABLISHED                                                                                                              
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50555     ESTABLISHED                                                                                                              
    tcp        0      0 192.168.0.240:1038      192.168.0.234:80        ESTABLISHED                                                                                                              
    tcp        0      0 192.168.0.240:1039      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1036      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1037      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1028      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1029      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1026      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1027      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1024      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1025      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1040      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:1041      192.168.0.234:80        ESTABLISHED
    tcp        0      0 192.168.0.240:8383      192.168.0.100:58245     ESTABLISHED
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50550     TIME_WAIT
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50558     ESTABLISHED
    tcp        0      0 192.168.0.240:8383      192.168.0.237:50554     TIME_WAIT
    tcp        0      0 192.168.0.240:8383      192.168.0.100:58244     ESTABLISHED
    www-data@Moxa:~$
     
    Устройство гораздо слабее малины(ARM9, RAM=32M), но с Linux на борту.
    Так что опция fork решит множественные подключения на один порт от разных клиентов.
    А вообще-то запустите socat -h и читайте маны.
     
  12. Sanchez5890

    Sanchez5890 Нерд

    Спасибо
     
  13. Sanchez5890

    Sanchez5890 Нерд

    Я пересмотрел ещё раз мануалы, и не совсем понял, куда мы можем перенаправить данные ведь mplayer является клиентом?
    Код (Text):
    socat tcp-l:8383,fork tcp-connect:192.168.0.234:80
    А здесь указан ip, как я понял другого сервера.
    То есть сервер ждет подключения, например нашей малины, потом перенаправляет данные на другой ip. Может быть мне нужно настроить этот сервер так чтобы он данные с одного клиента передавал на другой? Ведь схема скорее всего будет иметь такой вид: малина(клиент)->сервер->mplayer(клиент).
    Извините за путаницу
     
    Последнее редактирование: 19 июн 2019
  14. Igor68

    Igor68 Гуру

    Именно так! По некому порту прослушиваем входящие соединения и перенаправляем на другой IP с неким портом. Туда куда перенаправляем может быть как локально, так и по сети. Связь двухсторонняя - клиент послав запрос так же получает и ответ по этому соединению. Если почитаете маны, то найдёте, что можно по одному сокету принимать, а по другому передавать. Функционалность очень широкая: хоть к файлу, хоть к сокету, хоть к чему практически. И tty так же умеет.
     
  15. Sanchez5890

    Sanchez5890 Нерд

    Я наверное не понимаю, но ведь mplayer не имеет указанный ip? Он же не сервер?
     
  16. Igor68

    Igor68 Гуру

    А он из сети видео-аудио потоки умеет?
     
  17. Sanchez5890

    Sanchez5890 Нерд

    Здесь привели пример где малина - сервер. https://www.ekzorchik.ru/2017/05/how-to-get-live-video-from-a-csi-camera/
    Да, как я понял mplayer может слушать определённый ip и читать потоки.
    Код (Text):
    mplayer -fps 200 -demuxer h264es ffmpeg://tcp://10.7.8.53:2222
    P. S. Я это тестировал, у меня работает
     
  18. Igor68

    Igor68 Гуру

    А кто мешает тут тестировать поднимаете прослушивание на малине и при соединении с ней клиента она перенаправит на источник. Примерно так:
    Код (Text):

    socat tcp-l:2222,fork tcp-connect:10.7.8.53:2222
    mplayer -fps 200 -demuxer h264es ffmpeg://tcp://127.0.0.1:2222
     
    Тут на одной малине (или PC с Linux) локально поднимается socat и mplayer к нему подключается локально. А socat в свою очередь делает проброс для mplayer на 10.7.8.53:22

    И в то же время некий другой mplayer на другой малине получит это же соединение с 10.7.8.53:2222 через первую малину/ПК которая в локалке имеет IP ну допустим 192.168.0.100
    Код (Text):

    mplayer -fps 200 -demuxer h264es ffmpeg://tcp://192.168.0.100:2222
     
     
  19. Sanchez5890

    Sanchez5890 Нерд

    Спасибо, я попробовал и вот что я сделал и вот что получилось.
    Сначала запускаю сервер на пк с Ubuntu:
    Код (Text):
    socat tcp-l:2222,fork tcp-connect:192.168.1.198:2222
    Мой пк имеет ip 192.168.1.200 (ститический), перебрасывать я захотел на свободный, который никто не использует (192.168.1.198).

    Теперь запускаю малину с камерой:
    Код (Text):
    raspivid -t -0 -w 800 -h 600 -hf -ih -fps 20 -o - | socat - TCP:192.168.1.200:2222
    Здесь мы подключаемся к нашему пк и передаём ему видеопоток.

    И вот я уже был готов запустить mplayer, как получаю ошибку с малины Brocken Pipe и сообщение с сервера:
    Код (Text):
    2019/06/19 15:46:11 socat[3411] E connect(5, AF=2 192.168.1.198:2222, 16): No route to host
     
    Подскажите, пожалуйста, что я сделал неправильно.
    P. S. Если запускать после сервера mplayer, а не малину, то тот пожалуется, что нету видеопотока и завершит работу.
     
  20.