我正在制作一个将在Raspberry Pi 3上运行的django项目。该Pi具有一个连接的USB摄像机。我项目中的网页之一将显示来自摄像机的视频。
我访问相机的方式是使用从here借来的代码,如下所示:
from django.http import StreamingHttpResponse, HttpResponseServerError
from django.views.decorators import gzip
import cv2
class VideoCamera(object):
def __init__(self):
self.video = cv2.VideoCapture(0)
def __del__(self):
self.video.release()
def get_frame(self):
ret,image = self.video.read()
ret,jpeg = cv2.imencode('.jpg',image)
return jpeg.tobytes()
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\r\n')
@gzip.gzip_page
def view_cam(request):
try:
return StreamingHttpResponse(gen(VideoCamera()),content_type="multipart/x-mixed-replace;boundary=frame")
except HttpResponseServerError as e:
print("aborted")
它很好用,除了django的单个实例一次只能观看视频流的事实。如果另一个进程已经运行cv2.VideoCapture(0)
并且您再次运行它,则该方法调用将阻塞,直到另一个进程使用.release()
释放锁为止。
据我所知,这实质上意味着您只能在任何给定时间让一个浏览器观看视频供稿。
观看USB摄像机供稿是否存在某种固有的限制?我是否需要某种单一的后台进程来监视此提要,并使用某种IPC将视频帧重新分配给所有django实例?还是有更简单的方法让多个浏览器观看同一提要?