覆盆子视频流在本地网络之外

时间:2018-04-30 16:12:35

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

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

Camera类

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 :(得分:0)

我同意bunnmatt ..如果您不在网络中,那么您需要将其添加到防火墙。

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

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

警告。在网络外部暴露端口会让您受到攻击。在开始更改路由器中的大量设置之前,一定要多做一些谷歌搜索。

祝你好运!

答案 1 :(得分:0)

如果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. 来工作
  5. 完成
  6. 是否需要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/