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

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

  1. Igor68

    Igor68 Гуру

    Если Ваша схема рабочая, то Ваш сервер принимая данные от малины при отсутствии mplayer дожен "кидать" этот поток куда-то в NULL (в питоне не подскажу). А при подключении mplayer соединять поток как Вы делали ранее сразу от малины. И ещё при обрыве связи с малиной, разрывать связь с mplayer.
     
  2. Sanchez5890

    Sanchez5890 Нерд

    Нет мой код не работает
     
  3. Igor68

    Igor68 Гуру

    Вы же говорили, что код испытан.
     
  4. Sanchez5890

    Sanchez5890 Нерд

    Разрыв связи я знаю как сделать, а вот null нет
     
  5. Sanchez5890

    Sanchez5890 Нерд

    А вы про сервер? Да он работает
     
  6. Sanchez5890

    Sanchez5890 Нерд

    Сервер да, я могу сделать разрыв, там просто через try except. Я думал вы спрашиваете работаеn ли клиент на python. А вот над null надо подумать.
     
  7. Sanchez5890

    Sanchez5890 Нерд

    Я также создал новую тему про клиент на python, может кто-то подскажет что делать c потоком.
    А чем может грозить, то что мы просто оставляем поток, когда ждем mplayer?
     
  8. Igor68

    Igor68 Гуру

    https://stackoverflow.com/questions/2929899/cross-platform-dev-null-in-python
    я не работаю с питоном, а это по ссылке:
    Код (Python):
    f = open("/dev/null","w")
    будет работать?
    если да, по пока нет mplayer передавайте в него, а при наличии mplayer передавайте ему(mplayer).
     
  9. Sanchez5890

    Sanchez5890 Нерд

    Так, то есть мы просто можем сюда сливать весь поток. Спасибо. Надо попробовать это организовать.

    А вот кстати это можно было бы решить так, если клиент был бы на питоне, то можно было бы создать дополнительное соединение с малиной и сервером и по нему давать команду начать видеопоток.
    Хотя у нас уже есть немного костыльный метод засунуть это в питон. Но он не даёт обрабатывать ошибки
    http://forum.amperka.ru/threads/ras...а-picamera-io-bytesio-буфер-и-проблемы.18742/

    В общем, сейчас пока пробую сливать видеопоток в null, а дальше война план подскажет
     
  10. Igor68

    Igor68 Гуру

    как раз у Вас при возможности null при отсутствии плейера передаёте в null, а при наличии плейера в него. Данные потока не надо хранить и накапливать в буфере.
     
  11. Sanchez5890

    Sanchez5890 Нерд

    Есть проблема, мы не можем делать ещё что то, пока ждем подключения, те запускаем sock.accept(). Я тут так подумал, вот что если организовать это как я сказал выше:
    У нас клиент на python. Вот такая последовательность действий и кода:
    • Запуск сервера, сервер ждет малину
    • Запуск малины, малина ждет подтверждения от сервера открыть видеопоток. Например ждет какой-нибудь строки например ("Go Malina"). Но пока сервер ничего не отправляет
    • У сервера уже подсоединена малина, но поток не идет. Это хорошо данные никуда не уходят и не куда не приходят. Сервер тогда открывает соединение с mplayer
    • Теперь все в сборе, можно пускать видеопоток. Сервер даёт сигнал малине (например "Go Malina") и поток пошел.
    Таким образом, в данном методе мы используем 2 сокета
    Вот только у этого метода есть проблема - клиент на питоне, надо искать метод, как это реализовать
     
  12. Sanchez5890

    Sanchez5890 Нерд

    А с клиентом на python вообще проблема, походу никто не знает:(
     
  13. Sanchez5890

    Sanchez5890 Нерд

    Sock.accept() просто морозит программу
     
  14. Sanchez5890

    Sanchez5890 Нерд

    Я сделал! Я сделал! Вот клиент на питоне!
    Код (Python):
    import socket
    import time
    import picamera


    with picamera.PiCamera() as camera:
        camera.resolution = (640, 480)
        camera.framerate = 24
        sock = socket.socket()
        sock.connect(('192.168.1.200', 11000))
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # необходимо для повторного использования адреса
       
        connection = sock.makefile('wb')
       
        try:
            camera.start_recording(connection, format='h264')
            while True:
                connection.flush()
           
               
        finally:
            camera.stop_recording()
            connection.close()
            sock.close()
    @Igor68, может стоит попробовать мой вариант? Результат будет одинаковый?
     
  15. Igor68

    Igor68 Гуру

    Рад вашим успехам!
    Сам испытать не могу... потому как питона нет. Раньше был, но больше не будет. Потому про питон молчу. Я на Си устроился и ещё bash по мелочи и в основном для связки.
    И потому с компонентами питона не могу сказать. (сначала вроде питон был удобен, а вот потом что-то не срослось)
     
  16. Igor68

    Igor68 Гуру

    А свой код испытайте по наличию/отсутствия компонентов (типа то камеры нет, то связь потерялась, то плейера нет). И если всё устраивает, то можно идти дальше.
     
  17. Sanchez5890

    Sanchez5890 Нерд

    Спасибо большое! Буду пробовать