Малиновый видеопоток вне локальной сети - PullRequest
0 голосов
/ 30 апреля 2018

Raspberry Pi 3B передает потоковое видео в мою локальную сеть.

Моя проблема: я хочу получить доступ к потоку из любого места, и сейчас я могу просматривать его только из браузера, если я подключен к той же сети.

Вот код, который я использую.

class Streamer:
   app = Flask(__name__, template_folder='../resources/templates')
    stream = None

    @staticmethod
    @app.route('/')
    def index():
        return render_template('streaming.html')

    @staticmethod
    def gen():
        while True:
            frame = Camara.get_frame()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

    @staticmethod
    @app.route('/video_feed')
    def video_feed():
        return Response(Streamer.gen(),
                        mimetype='multipart/x-mixed-replace; boundary=frame')

    @staticmethod
    def start():
        Camara.set_stream()
        Streamer.stream = Process(target=Streamer.app.run, args=('0.0.0.0', 5000))
        Streamer.stream.start()

    @staticmethod
    def shutdown():
        if Streamer.stream:
            Streamer.stream.terminate()
            Streamer.stream.join()
            Streamer.stream = None
            return True
        else:
            return False

Класс камеры

class Camara:
    cap = None
    out = None

    @staticmethod
    def set_stream():
        try:
            if Camara.cap:
                logging.debug("Camera busy")
                Camara.cap.release()
            Camara.cap = cv2.VideoCapture(0)
        except Exception as exception:
            logging.error("Error setting up camera: " + exception)

    @staticmethod
    def get_frame():
        ret1, frame = Camara.cap.read()
        ret2, jpeg = cv2.imencode('.jpg', frame)
        return jpeg.tobytes()

HTML-шаблон

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>YoloDoor Stream</title>
    </head>
    <body>
        <img id="bg" src="{{ url_for('video_feed') }}">
    </body>
</html>

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Если такая информация, как router model, server (Apache/NginX/Node), вы получите много точной информации. Собранная информация - только RPi3 и язык реализации (не относится к этому вопросу).

Как уже отмечали другие, решение, которое вы ищете, это выставление вашего локального порта для публичного доступа .

Предполагается, что ваш поток доступен на http://192.168.0.1:8080 в вашей локальной сети. Вам необходимо настроить маршрутизатор для переадресации портов / виртуального сервера.

Ваша цель будет ..

  • Назначить статический IP-адрес и определить номер порта для переадресации порта
  • Добавлена ​​базовая аутентификация в корневой каталог ( читайте в Apache Basic Auth , чтобы добавить базовую подсказку для входа в систему)
  • Предоставить публичный IP-адрес (и номер порта, если он отличается от port 80) через DNS

Решение ниже через noip.com (провайдер DNS) - бесплатная версия требует подтверждения каждые 30 дней.

  1. Создайте no-ip.com учетную запись для владения именем хоста (например, mycam.ddns.net)
  2. Настройка no-ip DUC (клиент динамического обновления) , поэтому ваше имя хоста будет соответствовать IP вашей локальной сети.
  3. Успешная настройка позволит сценарию примера работать, набрав mycam.ddns.net:8080
  4. Выполнено

Требуется ли DNS?

IP вашей локальной сети к внешнему миру (производимый вашим маршрутизатором) периодически меняется. DNS позволяет использовать странный номер, такой как 175.143.141.29 сегодня и по-другому завтра, как домен (например: mycam.ddns.net)

Требуется ли локальный статический IP-адрес?

Когда ваш DHCP обновляется (маршрутизатор перезагружается, другое устройство выходит из системы и включается), ваш IP-адрес, используемый вашим RPi сегодня (например, 192.168.0.1), может быть 192.168.0.9 при следующем обновлении.

Статический IP-адрес позволяет 192.168.0.1 быть зарезервированным для device MAC address (another form of network identity), поэтому он всегда указывает на одно и то же устройство при будущем обновлении.

Хотя более новый маршрутизатор намного умнее зарезервировать такой IP для такого устройства на более длительный период. Однако no-ip DUC может сделать это за вас, так как сообщает серверу, с какого IP-адреса он в данный момент подключен.

Безопасность

Если вы сможете получить к нему публичный доступ, другие смогут сделать то же самое. Действуйте со здравым смыслом.

Альтернативная настройка

Из-за различных возможностей настройки читайте больше на Port Forwarding / Virtual Server.
Пример дополнительной настройки RPi здесь: https://pimylifeup.com/raspberry-pi-port-forwarding/

0 голосов
/ 30 апреля 2018

Я согласен с bunnmatt. Если вы находитесь за пределами своей сети, вам нужно добавить это в брандмауэр.

В вашей локальной сети, если вы перейдете на http://192.168.1.1,, то вы попадете на страницу администрирования вашего роутера. Оттуда вы можете настроить правило для показа этого приложения / порта для внешнего мира. Затем, чтобы получить к нему доступ, вы должны ввести IP своего дома в браузер и получить к нему доступ таким образом.

Другой способ (в случае, если вы не можете получить доступ к странице администрирования маршрутизаторов) - это использовать Ngrok: https://ngrok.com/,, который обрабатывает прокси-контент и открывает его через http или https ..

Слово предупреждения. Разоблачение портов вне вашей сети открывает вам возможности для атаки. Обязательно сделайте немного поиск в Google, прежде чем вы начнете изменять множество настроек в вашем роутере.

Удачи!

...