为什么每隔几次写入HTTP流就会暂停>100ms?

2024-09-30 06:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

使用的循环是

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


Tags: 图像imagefalsecloseresponseawaitframewrite

热门问题