我的 django 服务器以 jpeg 流的形式提供视频源,一次一帧。
它看起来像这样:
class VideoCamera():
def __init__(self):
# code
def get_frame(self):
# code
return frame
def gen(camera):
while True:
yield camera.get_frame()
def view_cam(request):
return StreamingHttpResponse(gen(VideoCamera()), content_type="multipart/x-mixed-replace;boundary=frame")
这是实时摄像头直播,因此直播没有尽头。我需要在客户端断开连接时中断它,但到目前为止,我不知道如何检测客户端断开连接。
我错过了什么吗?
Edit:
为了消除与相机有关的任何内容,我这样做了:
def gen():
for i in range(1000):
time.sleep(1)
print(i)
yield i
def view_cam(request):
return StreamingHttpResponse(gen(), content_type="multipart/x-mixed-replace;boundary=frame")
并连接到我的视图curl -N http://localhost/my_app/view_cam/
。它流式传输数字,当我使用 Ctrl+C 停止curl 时,生成器会无限期地继续运行,而不会注意到客户端消失了。如果我再运行并停止卷曲几次,我就会有多个实例gen()
函数正在运行,这正是相机所发生的情况。
Edit 2:
该项目使用 Django Channels。我刚刚注意到,如果我通过在 settings.py 中注释掉通道来禁用通道,则上面的示例可以完美运行。我不认为渠道与这个问题有关,但显然,不知何故,它是相关的。
通道开发服务器实际上会在 10 秒后检测到断开连接(不像默认的 django 服务器那样立即检测到),并显示如下:
应用程序实例 call() 运行于
/home/pi/paperless_clipboard/venv3/lib/python3.5/site-packages/channels/http.py:213>
wait_for=._call_check_cancel() 在
/usr/lib/python3.5/asyncio/futures.py:452,Task._wakeup()]>> for
连接关闭时间太长并被终止。
但尽管有消息称有东西被杀了gen()
继续运行,将数字打印到终端。