为了账号安全,请及时绑定邮箱和手机立即绑定

多部分/x-混合-替换 PNG 流始终在最后一个之前显示帧

多部分/x-混合-替换 PNG 流始终在最后一个之前显示帧

Go
翻阅古今 2022-08-01 15:05:57
制作了一个程序,通过标题将PNG图像流式传输到浏览器,我注意到标签中只显示倒数前的帧,而不是最近发送的帧。multipart/x-mixed-replaceContent-Type<img>这种行为非常烦人,因为我仅在图像更改时发送更新以节省带宽,这意味着在我等待更新时屏幕上会出现错误的帧。具体来说,我正在使用Brave浏览器(基于chromium),但是由于我已经尝试了上下两个“shields”,因此我认为至少在其他基于chromium的浏览器中也会出现此问题。搜索问题只产生一个相关结果(以及许多不相关的结果),即这个HowToForge线程,没有回复。同样,我也认为问题与缓冲有关,但我确保刷新缓冲区无济于事,这与线程中的用户非常相似。用户确实报告说它在他们的一个服务器上工作,而不是在另一个服务器上工作,这使我相信它可能与特定的HTTP标头或类似的东西有关。我的第一个猜测是因为浏览器可以从中分辨出图像何时完成,但它似乎没有任何影响。Content-Length所以从本质上讲,我的问题是:有没有办法告诉浏览器显示最新的多部分/ x-mixed-replace而不是之前的那个?而且,如果这不是标准行为,原因可能是什么?当然,这是相关的源代码,尽管我认为这更像是一个通用的HTTP问题,而不是与代码有关的问题:
查看完整描述

3 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

多部分 MIME 邮件中的部分以 MIME 标头开头,以边界结尾。在第一个实部之前有一个边界。此初始边界关闭了 MIME 前导码。

相反,您的代码假定部件边界开头。基于此假设,首先发送边界,然后发送 MIME 标头,然后发送 MIME 正文。然后停止发送,直到下一部分准备就绪。因此,只有在发送下一个部件后,才会检测到一个部件的末端,因为只有这样,您才会发送前一个部件的结束边界。

若要解决此问题,代码最初应发送一个边界来结束 MIME 前导码。然后,对于每个新部件,它应发送 MIME 标头、MIME 正文,然后发送边界以结束此部件。


查看完整回答
反对 回复 2022-08-01
?
哔哔one

TA贡献1854条经验 获得超8个赞

我有同样的问题:使用时有1帧延迟multipart/x-mixed-replace

这个问题似乎出现在Chrome中,它似乎与Chrome不再支持资源的事实有关。此问题在 Firefox 中不存在。multipart/x-mixed-replace

因此,“诱骗”Chrome显示视频流的唯一方法是将每个图像发送两次或接受1帧延迟。如前所述,问题在Firefox中不存在。


查看完整回答
反对 回复 2022-08-01
?
慕沐林林

TA贡献2016条经验 获得超9个赞

这是Chrome的一个问题。在Firefox中,它按预期工作。

我通过以下方式解决了这个问题C# example

var chromeWorkaround = Encoding.UTF8.GetBytes($"\r\n--{Boundary}\r\n\r\n--{Boundary}\r\n");

将其附加到您的流中,它似乎会强制镶边立即呈现。

我在这里报告了:https://bugs.chromium.org/p/chromium/issues/detail?id=1250396


查看完整回答
反对 回复 2022-08-01
  • 3 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号