微信C2C渐进式图片流式传输系统简介

在微信C2C图片服务中,用户体验一直是第一位的,由架构平台部研发的微信C2C后台系统,也一直在用户体验上深入研究,经过多次技术数据的验证,采用渐进式格式,和产品体验的巧妙结合,可以大大的降低用户的体验时延,接下来会详细介绍我们的应用过程。


一、渐进式图片


JPG图片支持两种编码方式:基线式(baseline)和渐进式(progressive)。业界应用最广泛的是基线式,因为它编解码计算开销小,实现比较容易。渐进式在编码的时候,要多次扫描图片,计算开销大约是基线式的3-5倍(但比起Google的WebP编码8-10倍开销还是小很多)。两者编码出来的文件大小基本相同,渐进式往往会更小一些。基线式的编码方式是图片从上到下,从左到右地进行处理和编码,如图1。渐进式编码方式是先全局后局部,先轮廓再细节的编码方法,如图2。


图1 基线式图片展示过程


图2 渐进式图片展示过程


渐进式图片编码特性,可以被用来有选择性地控制传输的数据量,提高传输的成功率。在条件较差情况下,宁可丢弃了图片的部分不重要细节,换取传图功能的可用性。图3是收取到原图片一定比例数据的图片效果(局部对比)。


图3 不同比例的图片显示效果对比


从图中可知,接收到图片的数据越多,图片展示越清晰。在20%的时候,还看不清楚图片中的文字,到了60%的时候,文字已清晰可见,再到80%以及100%,图片细节更清楚,但如果没有多张图片仔细比较,已看不出图片差异。


除了JPG支持渐进式编码格式,其他比如webP、HEVC在设计上也都支持渐进式的。要使用其他格式,只需要替换一下图片的编解码库即可,下文涉及的业务交互流程是不变的。


二、流式传输


这是类似流水线的传输过程,边传输边处理,在视频播放中普遍使用。通俗地说,就是数据像流水一样在网络中传输,通信双方在数据传输进行的过程中就即时处理,而不是等全部数据接收完毕再处理。


有别于流式传输的是普通“文件传输”,将整个图片文件当成一个整体,接收方在收到完整的数据后,再进行处理。或者将图片分成几个有限的小分片,每个分片是一个整体,单独进行传输,最后把分片拼接起来组成原图片。图片分片,往往配合并发传输,建立多个通道,同时传输多个分片,这在传统高速可靠的有线网络中效果很好,但在带宽有限、信号不稳定的无线网络中,效果往往不比单通道好。


三、图片最小传输长度


在实际应用中,传输一个完全看不清楚的图片是没有意义的,因此对渐进式图片传输的数据有一个最低要求,保证收到的图片基本可用。我们称这个长度为图片最小传输长度(MinimalTransport Size),MTS与原图片总大小(TS,Total Size)的比值,称为传输因子Q。公式如下:


Q=MTS/TS


或者写成:


MTS = TS×Q


传输因子Q可根据多种因素来调节,包括终端所在网络类型、信号强度、传输目标图片的尺寸和质量等。


在这个传输系统中,发送方只要发送图片的最小传输长度,即可向用户展示发送成功,然后转到后台尽量把完整数据发送完毕。在条件不允许(网络中断、没电、用户切换APP等)情况下,可以不用发送更多数据。


四、系统结构


为了便于讲述系统工作原理,架构和流程作了一定简化。


图片传输过程的步骤如下:


1)    发送方图片预处理,将其他图片格式转换成渐进式JPEG格式。


2)    发送方组织发送的数据流,将发送方UIN、接收方UIN,图片总长度,MTS长度等元信息组织在数据流的最前面,渐进式图片数据组织在数据流的后面。


3)    发送方发送数据,中转服务器接收数据,并且不断向发送方确认已接收到的数据长度,同时解析数据流前半部分的元信息,得到收发双方的UIN,图片总长度,以及MTS长度。


4)    当中转服务器收到MTS长度时,认为图片接收成功,将已收到的数据落地,并立刻向发送方返回图片唯一标识fileid。发送方收到fileid之后,认为图片发送成功,立刻向用户展示发送成功,然后转到后台继续发送图片剩余数据。发送方用户会体验到发图时间缩小了,发图过程变快了。


5)    如果发送方此时网络正常,图片数据将被全部发送完毕。如果发送方此时网络不稳定导致无法发送更多数据,发送过程结束,并不用记录任何状态,后续也不再重发这张图片。


6)    中转服务器在返回fileid的同时,立刻通过信令通道通知接收方收到一张新图片。


7)    接收方在收到新图片通知后,如果用户立刻查看新图片,将看到MTS长度对应的图片;如果用户没有立刻查看,而是过一段时间后查看图片,服务器可能已收到更多甚至完整的图片数据,用户将看到比MTS更清晰的图片。


8)    接收方在展示图片时,无需等到接收到完整图片才展示给用户,收到多少就展示多少,用户无需等待,直接看到一个从模糊到清晰变化的图片,大大缩小收图等待时间。


五、其他说明


1、 实际系统中,MTS能够根据网络传输情况动态调整,智能选择一个图片质量和传输耗时都合理的值。


2、 对未完整传输的图片,下载服务器会自动填充必要的信息,使其成为一个完成的图片,使得不支持渐进式图片格式的终端或者浏览器可以展示这张图片。


在图片用渐进式编码格式的基础上,配合流式传输的控制方式,再加上动态可调整的文件最小传输长度,是该图片传输系统的“两把刷子”,缺少任何一个因素,效果都大大减弱。


出处:https://mp.weixin.qq.com/s/Wbdq5etF_Wy86rSe80snUQ


版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。


-END-


架构文摘

ID:ArchDigest

互联网应用架构丨架构技术丨大型网站丨大数据丨机器学习

更多精彩文章,请点击下方:阅读原文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微信小程序对外提供了开发者工具和相应的 API,使得开发者可以通过微信小程序框架开发出具有特定功能的应用程序。其中,enableChunked 是一个用于设置网络请求传输的方法。 在微信小程序中,网络请求可以选择使用 enableChunked 方法进行设置,以实现传输传输是指在发送网络请求数据时,将数据分成多个小块(chunk)逐渐传输的方。相较于一次性传输所有数据,传输可以提升网络传输的效率和性能。 通过 enableChunked 方法,开发者可以将网络请求的数据根据需要分成适当的大小的块,并逐个发送。这种分块传输可以减少网络传输的等待时间,提高数据的及时性和实时性。同时,因为每个小块的数据量较小,也能更好地适应网络传输的变化和抖动。 在使用 enableChunked 方法时,开发者需要传入一个布尔类型的参数来决定是否启用传输。通过设置为 true,即 enableChunked(true),开发者可以启用传输。如果设置为 false,则会禁用传输,按照传统的方进行数据传输。 总之,通过微信小程序提供的 enableChunked 方法,开发者可以灵活选择是否启用传输,以满足不同应用场景对网络传输的需求。同时,传输也能更好地提升小程序的性能和用户体验。 ### 回答2: 微信小程序的enableChunked传输(也称为分块传输)是指在小程序中使用的一种数据传输。当我们向服务器请求大量数据时,如果使用传统的一次性传输,可能会导致传输时间过长、占用大量内存等问题。而启用了enableChunked传输,可以将数据分块传输,即边传输边解析数据。 在微信小程序中启用enableChunked传输的关键步骤如下: 1. 在代码中创建一个 WebSocket 对象,用于建立与服务器的连接。 ``` const socket = wx.connectSocket({ url: '服务器地址' }); ``` 2. 监听WebSocket连接成功事件,当连接成功后,可以进行下一步操作。 ``` socket.onOpen(() => { // 连接成功后的操作 }); ``` 3. 向服务器发送请求,并设置请求头中的"accept-encoding"参数为"chunked"。 ``` const header = { "accept-encoding": "chunked" }; socket.send({ data: '请求数据', header: header }); ``` 4. 监听WebSocket的message事件,当服务器返回数据时,通过该事件进行数据的接收和处理。这里的数据是以分块形传输的。 ``` socket.onMessage((res) => { // 对接收到的数据进行处理 }); ``` 通过以上步骤,我们可以实现微信小程序中的enableChunked传输。这种方可以提高数据传输和解析的效率,减少对内存的占用,提升用户体验。同时,对于一些需要大量数据的小程序功能,如音视频播放、文件下载等,传输也能够较好地满足需求。 ### 回答3: 微信小程序的enablechunked传输是一种功能,它允许小程序在数据传输过程中以分块的方发送和接收数据。传统的数据传输是将所有的数据一次性发送或接收完毕,而enablechunked传输可以使得数据的传输更加灵活和高效。 通过启用enablechunked传输,小程序可以将较大的数据切割成多个块进行传输,而不需要等待数据完全准备好才进行传输。这种分块传输的方可以提高数据传输的效率,减少传输的延迟。 enablechunked传输在小程序开发中有多重优势。首先,它可以提升小程序的用户体验,因为分块传输可以快速展示页面内容,而不需要等待所有数据加载完毕。其次,它可以减少小程序对网络带宽的占用,通过分块传输可以减少数据传输量,从而节省用户量。此外,由于enablechunked传输可以将数据分块发送,即使在网络不稳定的情况下仍然可以保证数据的正常传输。 为了使用enablechunked传输,开发者需要在微信小程序中进行相关配置。具体的配置方可以参考微信小程序的开发文档和相关示例代码。在实际开发中,开发者需要考虑数据的切割和组合,确保分块数据的正确传输和接收。 总之,enablechunked传输微信小程序提供的一项优秀功能,能够提高小程序的性能和用户体验。通过启用这个功能,开发者可以更好地处理和传输大量数据,为用户提供更好的服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值