gpt4 book ai didi

python - 为什么写入文件可以工作,但写入 HTTP 服务器请求处理程序却不起作用?

转载 作者:行者123 更新时间:2023-12-01 00:07:28 25 4
gpt4 key购买 nike

我使用 Raspberry Pi Picamera 板来捕获数据,使用以下代码:

with picamera.PiCamera(
sensor_mode=4,
resolution='1640x1232',
framerate=30
) as camera:

camera.rotation = 180
camera.start_recording(StreamingOutput(), format='mjpeg')

try:
server = StreamingServer(('', 8000), StreamingHandler)
server.serve_forever()
finally:
camera.stop_recording()


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

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)


class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer):
allow_reuse_address = True
daemon_threads = True


class StreamingHandler(server.BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/capture.jpg':
with self._output.condition:
self._output.condition.wait()
frame = self._output.frame

# This works.
with open("frame.jpg", 'wb') as f:
f.write(frame)

# This produces a truncated image.
self.send_response(200)
self.send_header('Content-Type', 'image/jpeg')
self.send_header('Content-Length', len(frame))
self.end_headers()
self.wfile.write(frame)

这是最该死的事情:虽然图像可以很好地保存到磁盘(frame.jpg 完全没问题),但如果通过 HTTP 服务器,它会产生截断的图像。这是屏幕截图:

truncated image

我尝试了很多不同的方法,但我陷入了死胡同。有什么想法吗?

最佳答案

我的猜测是您遇到了内存问题。当您写入磁盘时,内容会被流式传输,但我预计在使用 wfile.write(frame) 时,您必须将使用的内存几乎增加一倍,因为您没有对数据进行分块(而不是使用在任何给定时间,内存中的 frame 和一大块 frame 都会有两个副本。我会尝试使用 Shutil 来查看是否可以通过执行 shutil 来纠正问题。 copyfileobj(frame, self.wfile)。这只是一个猜测,但希望它能解决您的问题!shutil docs

关于python - 为什么写入文件可以工作,但写入 HTTP 服务器请求处理程序却不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59869993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com