使用Flask App的Raspberry Pi实时视频流可与默认开发服务器配合使用,但不适用于Apache生产

时间:2018-05-18 03:43:31

标签: python apache flask raspberry-pi video-streaming

我在Raspberry Pi上的Apache网络服务器上托管了一个简单的Flask应用程序,使用来自https://blog.miguelgrinberg.com/post/video-streaming-with-flask的教程从PiCamera流式传输实时视频。一切都在我的本地工作正常,我可以访问我的http://localip:5000来获取我的实时视频。我现在想在生产服务器上托管它,我使用Apache。我设置链接我的Flask应用程序的所有配置文件和目录结构,并为端口80设置服务器。我访问http://ip:80我的网页加载标题,标题和静态文本,但视频应该在下面它现在是一张破碎图像的图片"。检查浏览器上的网页视频元素表明服务器没有返回任何内容。

我看到了另一篇文章Video Straming on raspberrypi using flask apche2and wsgi server,一个与我遇到同样问题的人。他标记了一个答案,称Apache没有root权限访问picamera,因此无法访问它。我知道Apache作为www-data组用户运行,我不知道我应该授予哪个文件夹/文件权限,以便它可以访问PiCamera。我不知道如何从这里开始。在内部使用inbuild flask dev web服务器一切都很完美,但是通过Apache服务相机并不能捕获图像。请帮我。这是我的基本代码和配置(Flask app name是VideoStream):

VideoStream.wsgi

#!/usr/bin/python3
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/VideoStream/")

from VideoStream import app as application

Apache配置文件:

<VirtualHost *:80>
                ServerName 10.0.0.69
                ServerAdmin realityreccode@gmail.com
                WSGIScriptAlias / /var/www/VideoStream/VideoStream.wsgi
                WSGIDaemonProcess VideoStream user=www-data group=www-data threads=5 home=/var/www/VideoStream/
        <Directory /var/www/VideoStream/VideoStream/>
                WSGIProcessGroup VideoStream
                WSGIApplicationGroup %{GLOBAL}
                WSGIScriptReloading On
                Order allow,deny
                Allow from all
                </Directory>
                ErrorLog ${APACHE_LOG_DIR}/VideoStream-error.log
                LogLevel warn
                CustomLog ${APACHE_LOG_DIR}/VideoStream-access.log combined 
</VirtualHost>

目录结构:

/var/www/VideoStream/
VideoStream.wsgi
VideoStream/
    __init__.py
    camera_pi.py
    base_camera.py
    templates/index.html

__ init__.py - Flask app:

#!/usr/bin/python3
from importlib import import_module
import os
from flask import Flask, render_template, Response
from VideoStream.camera_pi import Camera


app = Flask(__name__)


@app.route('/')
def index():
   return render_template('index.html')
def gen(camera):

while True:
    frame = camera.get_frame()
    yield (b'--frame\r\n'
           b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
@app.route('/video_feed')
def video_feed():

    return Response(gen(Camera()),
                mimetype='multipart/x-mixed-replace; boundary=frame')


if __name__ == '__main__':
    app.run(host='10.0.0.69', threaded=True, debug=True)

0 个答案:

没有答案