我有一个Flask框架的python应用。我在我的索引页上显示来自摄像头的视频流,就像这样。
<img id="bg2" src="{{ url_for('video') }}" width="400px" height="400px">
一切都很好,但如果我直接刷新页面,奇怪的事情就会发生。如果我转到另一个页面,然后回到索引页,一切也都能正常工作。
对象0x7fc579e00240的错误:正在释放的指针没有分配。
断言fctx->async_lock在libavcodecpthread_frame.c:155处失败。
或
分段故障11
这是数据来源的端点。
@app.route('/video')
def video():
return Response(video_stream(),
mimetype='multipart/x-mixed-replace; boundary=frame')
def video_stream():
global video_camera # Line 1 ----------------------
if video_camera == None: # Line 2 ----------------------
video_camera = VideoCamera()
while True:
frame = video_camera.get_frame()
if frame != None:
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
如果我删除这些注释行,一切都能正常工作 但由于新对象的不断初始化,速度很慢,而且很沉重
下面是我的相机对象,如果它能帮到你的话
class VideoCamera(object):
def __init__(self):
self.cap = cv2.VideoCapture(0)
def __del__(self):
self.cap.release()
def get_frame(self):
ret, frame = self.cap.read()
print(ret)
if ret:
ret, jpeg = cv2.imencode('.jpg', frame)
return jpeg.tobytes()
好吧,所以一个解决方案是不使用全局对象。这是新的video_stream()函数。
def video_stream():
video_camera = VideoCamera();
...
另一个可能的解决方案是使用线程锁,像这样。
def video_stream():
global video_camera
if video_camera == None:
video_camera = VideoCamera()
while True:
with lock:
frame = video_camera.get_frame()
if frame != None:
global_frame = frame
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')