1

试图包装 RSTP 流,StreamingHttpResponse并且在 Django 中使用 WSGI 服务器完全可以正常工作,但我需要使用 ASGI 应用程序来实现这一点。

下面的代码供参考。

在 ASGI 中,由于 while True 循环而不断加载,但在 WSGI 中它可以正常工作。我不确定它是否因为 WSGI 或 ASGI 而发生。

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 livecam_feed(request):
    return StreamingHttpResponse(gen(LiveWebCam()),
                    content_type='multipart/x-mixed-replace; boundary=frame')

class LiveWebCam(object):
    def __init__(self):
        self.url = cv2.VideoCapture("<RTSP link here>")

def __del__(self):
    cv2.destroyAllWindows()

def get_frame(self):
    success,imgNp = self.url.read()
    resize = cv2.resize(imgNp, (640, 480), interpolation = cv2.INTER_LINEAR) 
    ret, jpeg = cv2.imencode('.jpg', resize)
    return jpeg.tobytes()

asgi.py

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'BMS_host.settings')

# application = get_asgi_application()
django.setup()

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter([
            url(r'^ws/', BmsConsumer.as_asgi()),
            url(r'^dash/', DashConsumer.as_asgi()),
            url(r'^component/', ComponentConsumer.as_asgi()),
        ])
    ),
})
4

0 回答 0