微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么写入 HTTP 流会每隔几次写入暂停超过 100 毫秒?

如何解决为什么写入 HTTP 流会每隔几次写入暂停超过 100 毫秒?

我正在尝试使用带有 aiohttp 的多部分流通过 http 流式传输 MJPEG 视频。

我有一个基于 this Gist by james4388 的实现。我正在尝试每 30 毫秒左右发送一个新的 JPEG 图像。循环计时显示 await mpwriter.write(response,close_boundary=False) 通常需要 0.3 毫秒,但每 3-5 次需要 150-200 毫秒。这限制了我可以达到的最大帧速率,并在我试图避免的流中引入了延迟。

使用的循环是

while True:
        _,frame = wc.read()
        if frame is None:
            continue
        with MultipartWriter('image/jpeg',boundary=boundary) as mpwriter:
            result,encimg = cv2.imencode('.jpg',frame,encode_param)
            data = encimg.tostring()
            mpwriter.append(data,{
                'Content-Type': 'image/jpeg'
            })
            await mpwriter.write(response,close_boundary=False) # 'Pauses' here once every 3-5 times
        await response.drain()

我也尝试过使用 BaseHttpServer。这在调用 self.wfile.write(jpg.tostring()) 时表现出相同的行为。

虽然我在每个部分之后调用 response.drain(),但我认为这种暂停是在底层缓冲区通过网络刷新时发生的。每个 JPEG 帧(因此多部分流的每个部分)的大小为 441kB,因此对于 30fps,我将发送 13MB/s,但目前我达到 5.3MB/s。这是在专用的测试 LAN 连接上,所以我认为带宽不是问题(另一个使用 MJPEG 流的设备达到 >15MB/s)。

使图像尺寸更小(例如使用更高的压缩率)会增加我在命中块之前可以发送的帧数,但整体块仍然存在,我的吞吐量仍然只有 4.3MB/s。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。