我正在尝试使用带有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
目前没有回答
相关问题 更多 >
编程相关推荐