MJPG-Streamer, Rapbberry, CSI Camera. Стриминг как клиент

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

  1. Sanchez5890

    Sanchez5890 Нерд

    Доброго времени суток форум, помогите пожалуйста, извините за возможное повторение моей предыдущей темы. Я поисках хорошего способа для стриминга с CSI камеры без задержки наткнулся на MJPG-Streamer. Моя идея подразумевает такие условия стриминга:
    • Малина - клиент
    • Хочу использовать mjpg так как маленькая задержка + возможность запихнуть в pyqt
    • Есть компьютер с белым ip к которому и подключается малина. Она же ему и отправляет видеопоток.
    Исходя из этого, можете пожалуйста подсказать, как это можно реализовать.
     
  2. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    3 одинаковые темы...
    Зачем!?
     
  3. Sanchez5890

    Sanchez5890 Нерд

    Да нет BAR_MEN , тут другое, там неткэт и mplayer, тут всё по другому
     
  4. Sanchez5890

    Sanchez5890 Нерд

    Там был использован медиакомбайн ffmpeg, даже питон и netcat, но всё это не то. Огромная задержка если используем vlc, накапливающаяся задержка если tcp, артефакты если udp. MJPG - вот панацея, но как всегда сервер что для меня недопустимо. Создание данной темы не флуд, я хотел бы получить консультацию от тех кто знает, как можно использовать mjpg как клиент. Если данные темы нарушают правила форума, их ведь можно удалить верно?
     
    Последнее редактирование: 31 июл 2019
  5. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    2 нижних подчеркивания :p

    Если бы нарушали, то удалили бы
    А так только по просьбе ТС или по жалобам
     
  6. Sanchez5890

    Sanchez5890 Нерд

    Я немного порылся в интернетах и нашел очень худую документацию про mjpg-streamer:
    https://github.com/jacksonliam/mjpg-streamer/blob/master/README.md
    Если посмотреть все возможные выводы - то они 'не дают ничего отправить', но как идея открыть на малине сервер с выводом на http.
    Затем написать fork на сокетах (наверное нужен udp...), чтобы он отправлял всё это на сервер.
    Но как тогда потом считать этот видепоток на серверной стороне...
     
  7. Igor68

    Igor68 Гуру

    Перенаправление с cockat не по душе... надо так понимать?
    Вот это:
    Код (Bash):
    socat \
        -v -d -d \
        TCP-LISTEN:<некий порт для приёма запроса от малины>,crlf,reuseaddr,fork \
        SYSTEM:"
            echo HTTP/1.1 200 OK;
            echo Content-Type\: text/plain;
            echo;
            echo \"Server: \$SOCAT_SOCKADDR:\$SOCAT_SOCKPORT\";
            echo \"Client: \$SOCAT_PEERADDR:\$SOCAT_PEERPORT\";
        "

     
    то есть малина обратиться к вашему серверу с белым IP по http, который имеет запущенный вышеупомянутый скрипт. Из которого этот сервер получит IP малины. Только переделайте этот скрипт.
    После чего ваш этот белый сервер создаст ссылку на вашу малину, которую он и будет использовать. После чего другой socat и будет использовать переподключая клиентов на малину через себя.
    1. Малина подключается к белому серверу и последний определяет адрес малины
    2. белый сервер открывает порт и делает проброс через него на малину с неким портом
    3. потребительский клиент (плейер) подключается к белому серверу и сразу имеет соединение уже с малиной, на которой поднят некий сервер для отдачи данных.

    И ещё пусть малина циклически обращается к этому скрипту на белом сервере
     
    Sanchez5890 нравится это.
  8. Igor68

    Igor68 Гуру

    Вот так белый сервер будет делать перенаправление на малину:
    Код (Bash):
    socat tcp-listen:<порт для потребителей данных от малины>,fork tcp-connect:<IP малины>:<опрт сервера данных на малине>
    только если скрипт должен работать в тени не забудьте про "&" в конце строки запуска скрипта
     
    Sanchez5890 нравится это.
  9. Sanchez5890

    Sanchez5890 Нерд

    Отличная идея! Я плохо конечно разбираюсь в скриптах. Но я точно уловил вашу идею, единственное что я хотел бы поменять это tcp на udp, потому что нарастает задержка. Я пока не заметил ваш пост, тоже кое что придумал и реализовал:
    1. Запускаю малину и она выводит поток на http
    2. На малине запускаю udp-'вилочку' на питоне, которая читает видеопоток и отправляет его на сервер
    3. Считываю видеопоток пока что mplayerом, потом что нибудь придумаю
    Про задержку, она иногда нарастает, но потом пропадает. Не знаю почему. Обычная задержка думаю меньше 400 мс.
    А в случае таком например, ip малины сменился (потому что на ней стоит модем с симкой), нам тогда ничего перезапускать не надо, никакие скрипты? Повторюсь очень плохо в них разбираюсь
     
  10. Sanchez5890

    Sanchez5890 Нерд

    Если честно мне ваш метод больше нравится потому что тут не так много посредников, а всё реализовано на прямую. Но сильно волнует ситуация смены ip
     
  11. Sanchez5890

    Sanchez5890 Нерд

    И вот ещё вот такой вопрос, разве мы не получим обычный серый ip?
     
  12. Sanchez5890

    Sanchez5890 Нерд

    Я вот в скриптах не смог разобраться, но сделал тоже самое на питоне и сокетах.
    Подключиться не получается. Вот что я делал.
    1. Открываем сервер на пк-сервере, который ждет подключения малинки и принтит её адрес
    2. Запускаем простой код на малинке для подключения к нашему серверу
    3. Я получаю адрес малины на подобее
      ('85.26.164.83', 3674)
    4. Теперь запускаю mjpg-streamer на малине с указанным портом 3674 (из пункта 3)
    5. Открываю браузер, ввожу ip из пункта 3 с портом и ничего:(
     
  13. Igor68

    Igor68 Гуру

    Нет! Нет и НЕТ!
    Вы плейером подключаетесь к вашему ПК серверу, который через себя свяжет с его малиной через это:
    Код (Bash):
    socat tcp-listen:<порт для потребителей данных от малины>,fork tcp-connect:<IP малины>:<опрт сервера данных на малине>
    Что касается UDP, Вы help смотрели?
    Выжимка:
    Код (Text):
    tcp-connect:<host>:<port> groups=FD,SOCKET,CHILD,RETRY,IP4,IP6,TCP
    udp-connect:<host>:<port> groups=FD,SOCKET,IP4,IP6,UDP
    tcp-listen:<port> groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,IP6,TCP
    udp-listen:<port> groups=FD,SOCKET,LISTEN,CHILD,RANGE,IP4,IP6,UDP
    Правильнее всё сделать одним скриптом. И питон не нужен. Соединение напрямую через ПК сервер. Плейером не надо поединяться с малиной, а надо с ПК сервером на котором скрипт с socat.
     
    Последнее редактирование: 2 авг 2019
  14. Sanchez5890

    Sanchez5890 Нерд

    Извините я немного не понимаю. Вот я сейчас как понял вашу идею:
    1. Узнаём внешний адрес и порт малины (я не знаю как его узнать, кроме как через сокеты и мой любимый питон)
      ('85.26.234.88', 45430)
    2. Теперь открываю стрим-сервер на малине и указываю там порт 45430
    3. Теперь запускаю fork на пк и указываю там:
      Код (Bash):
      socat tcp-listen:10300,fork tcp-connect:85.26.234.88:45430
    4. Запускаю пока что mplayer и ничего не происходит
     
  15. Sanchez5890

    Sanchez5890 Нерд

    Вот такой вопрос, чтобы не играться с айпишниками, почему бы fork на малине не запустить?
    А потом подключится к этому форку через медиаплеер?
    Ну то есть как реализовать:
    1. Запускам стрим-сервер на малине
    2. Запускаем форк на малине:
      Код (Bash):
      socat tcp-listen:<порт стрим-сервера>,fork tcp-connect:<белый ip сервера>:<какой-нибудь порт>
      Ведь в таком случае мы все айпишники знаем
    3. Теперь запускаем mplayer на пк например
    Хотя вы сказали:
    Можете пожалуйста объяснить по подробнее ваш пример и мой рассмотреть. Просто не совсем мне понятна игра с ip адресом от малины.
     
  16. Igor68

    Igor68 Гуру

    Порт малины Вы знаете - это тот порт прослушивания вашего сервера на малине. Адрес иалины Вы (не Вы, а ваш ПК сервер на скрипте socat) узнаете, когда малина подключится к ПК серверу. Потом Ваш ПК сервер "пробросит" соединение к малине, получив адрес малины и зная порт вашего сервера на ней.

    Я вам давал этот пример:
    Код (Bash):
    socat \
        -v \
        TCP-LISTEN:<некий порт для приёма запроса от малины>,crlf,reuseaddr,fork \
        SYSTEM:"
            echo HTTP/1.1 200 OK;
            echo Content-Type\: text/plain;
            echo;
            echo \"Server: \$SOCAT_SOCKADDR:\$SOCAT_SOCKPORT\";
            echo \"Client: \$SOCAT_PEERADDR:\$SOCAT_PEERPORT\";
        "
    Запустите его указав : <некий порт для приёма запроса от малины> ну например 1234.
    Потом браузером (что там у Вас.... Firefox и т.п.) в адресной строке которого наберите "АдресПКсервера:1234" Вы должны получить что-то типа (я в локальной сети):
    Код (Text):
    Server: 192.168.0.234:1234
    Client: 192.168.0.237:39709
    где IP сервера и порт то куда (к кому подключился)
    А клиент IP того кто подключился и каой порт получил и он(порт) не важен.
     
    Sanchez5890 нравится это.
  17. Igor68

    Igor68 Гуру

    А вообще трудно мне говорить что 2*2=4. Вы не рано затеяли это???
     
    Sanchez5890 нравится это.
  18. Sanchez5890

    Sanchez5890 Нерд

    Спасибо буду пробовать
     
    Igor68 нравится это.
  19. Sanchez5890

    Sanchez5890 Нерд

    Хорошо вот ещё один глупый вопрос, теперь когда запускаю mjpg-streamer надо указать именно тот порт который мы получили с socat?
     
  20. Igor68

    Igor68 Гуру

    для плейера указывается порт который вы определили для сервера. Получаемые порты не должны быть интересны для Вас. Для плейера должен быть порт который вы указали в socat на ПК сервере. А для этого socat указываете плученный IP малины и порт сервера видео на малине.