对于移动 App 来说,IM 功能正变得越来越重要,它能够创建起人与人之间的连接。社交类产品中,用户与用户之间的沟通可以产生出更好的用户粘性。
在复杂的 Android 生态环境下,多种因素都会造成消息推送不能及时达到客户端。另外,不稳定的移动网络也给数据传输的速率和可靠性增加了障碍。
本文详解了网易云信 IM SDK 在应对弱网环境、移动端硬件限制以及 Android 复杂的生态现状时的探索与心得.如何实现不影响用户体验的后台保活,改善的长连接加推送组合方案,以及在弱网环境大数据传输的优化实践。
相关阅读推荐:
在即时通讯研发当中,音视频通话对实时性要求很高,但可以容忍一定的丢包,所以选择 UDP 私有协议来做为底层的传输协议。如果只是普通的 IM 消息,对网络情况其实不是太敏感,最多也就是慢一点,菊花转的久一点。但对于这种视频电话,如果网络差了,发生了经常性卡顿,或者是延迟很高,图像出现花屏,音视频不同步了,这个功能其实也就相当于废弃了。而且,音视频数据量本身也比较大,在弱网环境下发生问题的概率就更大了。
为了提高弱网下的实时音视频的通话效果,需要使用相关方案来做 QoS 保障:主要包括了基于 UDP 协议的拥塞控制、前向纠错 FEC 技术及相关的重传技术。同时网络层需要能够实时的探测到网络状态,作为底层调整 QoS 策略的依据,同时需要回调上层,来动态调整音视频的码率,做到音视频码率自适应。通过上面的 QoS 保障,实际测试在 60% 的随机丢包弱网环境下,音视频通话还能够正常进行。
下面再来看看对于 HTTP 的优化。图片语音是 IM 的必需元素,而且本身数据比较大。在弱网环境下,快速的上传下载,更少的等待时间可以带来更好的用户体验。
断点续传可以减少因网络原因导致的重复传输,减少传输时间,节省流量。
图片预加载技术可以根据不用网络情况,在收到消息后,就加载不同素质的预览图片,甚至直接将原图预加载,做到用户点开即看。
图片和语音文件并没有通过长连接收发,而是通过 HTTP 去做上传下载。传统上通过 HTTP 上传时,文件会分为一片一片,传完一片,收到回包,才会穿下一个分片,一直到最终传输完成。可以看到,服务器返回 ack 这段时间,上传通道其实是空闲的,如果把这段时间利用起来,可以节约不少上传时间。Pipeline 就是为此而来。通过重叠利用 http 请求的响应等待时间,加快传输速度。使用 Pipeline,需要修改 HttpClient,同时还需要服务器提供支持。视网络具体情况,使用 Pipeline 后,一次上传可以减少 20% 至 30% 的时间。
常规发送语音消息需要这几步,先录音,然后计算 hash 值,然后上传,上传完毕后,服务器计算一下校验和,通过后语音消息发送成功。在前面录制语音时,网络其实也是空闲的。把这段时间利用起来,则可以减少后面上传步骤的时间。优化后,流程就变成这样。在录制的过程中,每录完一段,就作为一个分片直接上传。直到最后录完,计算好 hash,再把最后一个分片带上 hash 信息上传。这里除了客户端的改动,也是需要服务器支持。服务器在开始接收时,很多信息都不明确,需要开辟缓存来记录整次上传过程。对于比较差的网络,边录边传的效果会更好,毕竟纯语音的比特率并不高,基本都能做到录完就传完。
随着即时通讯以及音频处理和压缩技术的不断发展,效果更好、适用范围更广、性能更高的算法和新的技术必将不断涌现,如果你有好的技术或者分享,欢迎关注网易云信官方博客和 GitHub:
关注更多技术干货内容:网易云信博客
欢迎关注网易云信 GitHub
欢迎关注网易云信官网
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。