【问题标题】:Raspberry video stream outside local network本地网络外的树莓视频流
【发布时间】:2018-05-01 15:38:59
【问题描述】:

我将 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>

【问题讨论】:

  • 您尝试从本地网络外部查看流的主机名/IP 是什么?听起来您可能需要公开您的 Pi 的 IP

标签: python flask video-streaming raspberry-pi3 cv2


【解决方案1】:

我同意 bunnmatt 的观点。如果您在网络之外,那么您需要将其添加到您的防火墙中。

在您的本地网络上,如果您转到 http://192.168.1.1,那应该会将您带到路由器的管理页面。从那里您可以设置一个规则以将此应用程序/端口公开给外界。 然后要访问它,您可以在浏览器中输入您家的 IP,然后以这种方式访问​​它。

另一种方法(以防您无法访问您的路由器管理页面)是使用 Ngrok:https://ngrok.com/,它处理代理内容,并将通过 http 或 https 公开它..

警告.. 将端口暴露在您的网络之外会使您受到攻击。在开始更改路由器中的大量设置之前,一定要多搜索一下。

祝你好运!

【讨论】:

    【解决方案2】:

    如果提供router modelserver (Apache/NginX/Node) 等信息,您将收到非常准确的信息。收集的信息只有 RPi3 和实现语言(与此问题无关)。

    正如其他人指出的那样,您正在寻找的解决方案是将您的本地端口公开

    假设您可以通过本地网络上的http://192.168.0.1:8080 访问您的流。您需要为您的路由器配置端口转发/虚拟服务器。

    你的目标是……

    • 分配静态 IP 并确定端口号以进行端口转发
    • 向根目录添加基本身份验证(read on Apache Basic Auth 添加基本登录提示)
    • 通过 DNS 向公众公开 IP(和端口号,如果不同于 port 80

    以下解决方案通过 noip.com(DNS 提供商)提供 - 免费版本需要每 30 天确认一次。

    1. 创建no-ip.com 帐户以拥有主机名(例如:mycam.ddns.net)
    2. 设置 no-ip DUC (Dynamic Update Client) 以便您的主机名与您的本地网络 IP 一致。
    3. 成功的设置将允许示例场景通过访问mycam.ddns.net:8080 工作
    4. 完成

    是否需要 DNS?

    您的本地网络 IP 到外部世界(由您的路由器产生)间歇性变化。 DNS 允许将奇怪的数字(例如 175.143.141.29 今天和明天不同)用作域(例如:mycam.ddns.net

    需要本地静态IP吗?

    当您的 DHCP 更新(路由器重新启动、不同设备注销和打开)时,您的 RPi 今天使用的 IP(例如: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。

    安全

    如果您可以公开访问它,其他人也可以这样做。从常识出发。

    替代设置

    由于各种设置可能性,请阅读端口转发/虚拟服务器的更多信息。
    更多 RPi 设置示例:https://pimylifeup.com/raspberry-pi-port-forwarding/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多