0

我希望我能找到你。

我真的在为一个个人项目而苦苦挣扎,如果有人能让我直截了当,我将不胜感激。

我希望从 django 的 picamera 流式传输视频。我看到了一些 cv2 的实现,在 cv2 上遇到了一些问题,并决定尝试一条替代路线。这里的一些代码来自 picamera 文档,一些来自我遇到的一些 cv2 实现。

当我点击 django url 时,相机开始流式传输,但是网页是灰色的,中间有一个小框,没有可见的流。

python3 -m django --version: 3.0.6

完整代码贴在下面。 这就是我所看到的

有人能指出我正确的方向吗?

谢谢你,达伦

from django.shortcuts import render
from django.http import HttpResponse
from django.http import StreamingHttpResponse
from doron.models import Storage
from django.views import generic
import picamera
import io
from threading import Condition
from time import sleep

class StreamingOutput(object):
    def __init__(self):
        self.frame = None
        self.buffer = io.BytesIO()
        self.condition = Condition()

    def write(self, buf):
        if buf.startswith(b'\xff\xd8'):
            # New frame, copy the existing buffer's content and notify all
            # clients it's available
            self.buffer.truncate()
            with self.condition:
                self.frame = self.buffer.getvalue()
                self.condition.notify_all()
            self.buffer.seek(0)
        return self.buffer.write(buf)

def livefe(request):

        def cam():
                with picamera.PiCamera(resolution='640x480', framerate=24) as camera:
                        output = StreamingOutput()
                        camera.start_recording(output, format='mjpeg')
                        try:
                                while True:
                                        with output.condition:
                                                output.condition.wait()
                                                frame = output.frame
                                        yield(b'--frame\r\n'
                                                b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

                        finally:
                                camera.stop_recording()

        try:
                return StreamingHttpResponse(cam(), content_type="multipart/x-mixed-replace;boundary=frame")
        except:  
                pass
4

1 回答 1

0

我现在确实在研究同一个主题,似乎我们在网上使用了几乎相同的模板。我遇到了这个问题,如果我没记错的话,我通过在录制开始和流媒体开始之间添加一点睡眠来解决它。

最后,我将整个init块移到另一个函数中,然后我可以使用页面上的按钮或稍后的其他条件调用该函数(稍后我将在第一次客户端登录时将其打开,在最后一次客户端注销时将其关闭):

camera = picamera.PiCamera(resolution='640x480', framerate=12)
output = StreamingOutput()
camera.start_recording(output, format='mjpeg')

希望能帮助到你。

于 2020-06-24T10:02:10.833 回答