首页 > 解决方案 > 如何使用 django 在网页上显示多个视频流?

问题描述

我正在尝试使用 django 在网页上显示来自手机(使用 IP 网络摄像头)的实时流。编码:

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')

def video(request):
    return StreamingHttpResponse(gen(IPWebCam(camera_ip)),content_type='multipart/x-mixed-replace; boundary=frame')


class IPWebCam(object):
    def __init__(self,camera_ip):
        self.url = "https://"+ camera_ip + "/shot.jpg"
        print(self.url)

    def __del__(self):
        cv2.destroyAllWindows()

    def get_frame(self):
        imgResp = urllib.request.urlopen(self.url,context=context)
        imgNp = np.array(bytearray(imgResp.read()), dtype=np.uint8)
        img = cv2.imdecode(imgNp, -1)
        # We are using Motion JPEG, but OpenCV defaults to capture raw images,
        # so we must encode it into JPEG in order to correctly display the
        # video stream
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        resize = cv2.resize(img, (270,250), interpolation=cv2.INTER_LINEAR)
        ret, jpeg = cv2.imencode('.jpg', resize)
        return jpeg.tobytes()

所以这里video是显示实时流的视图。我正在使用"{% url 'video' %}"在模板上呈现视图,并且还在 urlpatterns 中添加了视图。我显示流的模板具有网格视图。我想在每个网格中显示具有不同 IP 的摄像机。现在我能够在所有网格中显示相同的 IP 网络摄像头流,因为只有一个视图,即video我在模板中呈现相同的视图。

我想知道,如何在相应的网格中显示多个流?一页上有六个网格。我是否应该为每个网格创建一个视图,但会有超过 1 页,我不能继续创建这些视图并将它们添加到 urlpatterns。有没有办法可以使用相同的视图并使用动态 url 来解决这个问题?

标签: djangopython-3.xdjango-viewsdjango-templates

解决方案


您应该在视图中定义一个参数 (camera_ip)video以告知应该返回哪个摄像头流。

def video(request, camera_ip):
    return StreamingHttpResponse(gen(IPWebCam(camera_ip)),content_type='multipart/x-mixed-replace; boundary=frame')

您应该将所有 camera_ip 值传递给在您的详细视图中呈现的页面(我认为该视图存在但在您的问题中未提及),然后遍历 ip 信息以调用"{% url 'video' camera_ip %}"camera_ip更改每个循环步骤的位置。


推荐阅读