我在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)