我正在尝试修改用于屏幕流的here代码。在上面的教程中,它是用于从磁盘读取图像,而我正在尝试截取屏幕截图。我收到此错误。
断言isinstance(数据,字节),'应用程序必须写入字节' AssertionError:应用程序必须写入字节
我应该做些什么改变呢?
这是我迄今为止所做的 -
<br>index.html<br>
<html>
<head>
<title>Video Streaming Demonstration</title>
</head>
<body>
<h1>Video Streaming Demonstration</h1>
<img src="{{ url_for('video_feed') }}">
</body>
</html>
app.py
#!/usr/bin/env python
from flask import Flask, render_template, Response
import time
# emulated camera
from camera import Camera
# Raspberry Pi camera module (requires picamera package)
# from camera_pi import Camera
app = Flask(__name__)
@app.route('/')
def index():
"""Video streaming home page."""
return render_template('index.html')
def gen(camera):
"""Video streaming generator function."""
while True:
time.sleep(0.1)
frame = camera.get_frame()
yield (frame)
@app.route('/video_feed')
def video_feed():
"""Video streaming route. Put this in the src attribute of an img tag."""
return Response(gen(Camera()),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True, threaded=True)
camera.py
from time import time
from PIL import Image
from PIL import ImageGrab
import sys
if sys.platform == "win32":
grabber = Image.core.grabscreen
class Camera(object):
def __init__(self):
#self.frames = [open('shot0' + str(f) + '.png', 'rb').read() for f in range(1,61)]
self.frames = [ImageGrab.grab() for f in range(1,61)]
def get_frame(self):
return self.frames[int(time()) % 3]
完整错误: Link
答案 0 :(得分:0)
响应有效负载必须是一个字节序列。在该示例中,返回的图像是JPEG作为bytes
个对象。
但是,ImageGrab.grab()
返回的图像是一些PIL图像类而不是字节。因此,请尝试将图像保存为JPEG bytes
:
import io
仅为gen中的每次迭代拍摄屏幕截图:
class Camera(object):
def get_frame(self):
frame = ImageGrab.grab()
img_bytes = io.BytesIO()
frame.save(img_bytes, format='JPEG')
return img_bytes.getvalue()
gen函数:
def gen(camera):
while True:
time.sleep(0.1)
frame = camera.get_frame()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')