图片、音视频消息上传优化

通常图片、音视频等多媒体消息相对于文本消息会大很多,因此,多媒体消息在网络传输、实时触达等方面相需要有更多的优化。本文就针对如何使图片、视频、语音等多媒体消息发送得又快又稳进行相关分析。

多上传接入点

国内目前的固网宽带运营商构成复杂,且用户宽带向来呈现出“南电信北联通”的分布现状。而在移动网络下,移动、电信、联通三足鼎立,再加上还有教育网和海外两大网络体系,整体网络结构更加复杂,跨运营商网络访问的高延迟和不稳定性一直是个无法解决的老大难问题。

对于传输数据更多的视频、图片等多媒体消息来说,如果出现用户跨运营商来上传文件,多次 RTT(Round-Trip-Time,往返时延)带来的用户体验会更差。因此,要提升多媒体消息的上传性能和成功率,我们首先要从接入点着手。

典型的优化方法:

  • 针对不同的主流运营商提供不同的上传接入点 IP,然后通过运营商 DNS 解析,让用户能通过本运营商的上传接入点来快速上传图片和视频;

  • 进一步,相应后端的图片上传存储服务,也可以部署在多线机房,这样上传服务也能快速地把文件流提交给存储层,从而避免从接入点到存储服务的跨网开销,也能解决其他运营商的用户下载图片时需要跨网的问题。

当然多个接入点 IP 在管理和使用上会比较复杂。在实际应用中需要更多地注意。

上传链路优化

在上传普通文本消息时,一般会设计负载均衡层、接入服务层、业务逻辑层,另外,多媒体消息在上传时,在业务逻辑层后面一般还有一个用于文件存储的服务。因此,如果多媒体消息也通过文本消息的通道上传,整体链路会比较长。

对于图片、视频这种数据传输量大的消息来说,在这么长的链路上来回多次进行数据拷贝,整体性能会比较差,同时也会导致不必要的带宽浪费,而且可能会造成整个文本消息通道阻塞,影响普通消息的收发。

上传链路优化的思路就是出于性能和隔离的考虑,一般把这些多媒体消息上传通道和普通消息收发通道独立开。发送多媒体消息时,先通过独立通道上传文件流,上传完成后会返回文件的唯一标识 ID,然后再把这个唯一标识 ID 作为消息的引用,通过普通消息收发通道进行发送。

语音的“分片先行下推”

语音消息和图片、视频等多媒体的区别主要有:

  • 一般会有录制时长的限制,上传的文件较小,相对比较可控。

  • 从接收方的角度,图片和视频在接收查看的时候,都会有缩略图或者视频首帧图用于预览,不需要一开始就下载原文件,而语音消息没有预览功能,只能下载原文件用于播放。如果语音也和图片、视频等多媒体消息走一样的上传下载逻辑,播放时就需要去下载原文件,这样会容易出现下载慢、卡顿的情况。

因此,对于语音实时聊天,更好的优化方式是通过长连下推的方式将语音流推到对端,这样用户在播放语音时就不需要再从远程临时下载文件,使用流畅度也会更好。

在一些即时消息场景的实现中,会通过普通消息收发的长连通道来分片上传语音流,这样更方便通过长连来下推给接收方。

另外,**IM 服务端在接收到分片后,可以同步先行把分片的二进制流下推给接收方但暂不显示,不需要等所有分片都在后端存储完成再进行下推。**这样的好处是:当语音的最后一片到达后端并存储完成后,IM 服务端只需要给接收方推一条“所有分片存储完成”的轻量信令,即可让接收方马上看到这条语音消息。这个“分片先行下推”机制在实时性上比远程临时下载的方式更好,能有效降低语音聊天的延时。

分片上传

分片上传,是指“在客户端把要上传的文件按照一定规则,分成多个数据块并标记序号,然后再分别上传,服务端接收到后,按照序号重新将多个数据块组装成文件”。

对于图片、视频、语音等这种较大的消息来说,采用分片上传可以让客户端在分片完成后,利用“并行”的方式来同时上传多个分片,从而提升上传效率。

另外,分片上传的优势还有:

  • 在一些网络环境较差的场景下,采用“分片”的方式,可以在上传失败后进行重试时,不必重新上传整个文件,而只需要重传某一个失败的分片,这样也能提升重新发送的成功率和性能;
  • 此外,类似语音这种流式消息,在上传时可能不知道文件最终大小,采用分片上传可以让消息文件先部分上传到服务器,而没必要等到录制完才开始上传,也能节约上传的整体时长。

分片策略

在分片上传中,分片策略是一个重要但又比较有挑战的问题。

  • 分片太大,片数少,上传的并发度不够,可能会降低上传效率,每个大的分片在失败后重传的成本会比较高。
  • 分片太小,片数多,并发需要的 TCP 连接太多,多条 TCP 连接的“窗口慢启动”会降低整体吞吐,两端拆分与合并分片的开销也相应增加,而且传输时的额外流量(HTTP 报头)也会更多。

通常在网络状况较好的环境,比如在 WiFi、4G、5G 下,相应的分片大小应该设置得更大一些;而在 2G、3G 弱网情况下,分片可以设置小一点(减少弱网重传成本)。

对于分片大小的设置,简单一点的处理可以按照网络状态来粗略划分。比如,WiFi 下 2M,4G 下 1M,3G/2G 下 256K。当然也可以根据相关的算法策略自适应动态根据网络现状调整分片大小。

断点续传

在上传视频、图片等较大文件时,整体耗时会比较长,用户由于某些原因可能需要在上传未完成时临时暂停,或者遇上系统意外崩溃导致上传中断的情况。对此,如果要再次上传同一个文件,我们希望不必再重新上传整个文件,而是从暂停的位置“断点续传”,而上述分片上传机制,就能相对简单地实现“断点续传”功能。

  • 给每一次上传行为分配一个唯一的操作标识,每个分片在上传时除了携带自己的序号外,还需要带上这个操作标识,服务端针对接收到的同一个操作标识的分片进行“暂存”,即使由于某个原因暂停上传了,这些“暂存”的分片也不会马上清理掉,而是保留一定的时间。

续传时继续以之前同一个操作标识来上传,客户端先检查服务端已有分片的情况,如果没有过期就继续从上次的位置续传,否则需要重新从头开始上传。“断点续传”功能实现上比较简单,但在上传大文件时,对于提升用户体验是比较明显的。

图片、音视频消息上传优化相关推荐

  1. java图片音视频上传工具_java处理音视频,文档,图片所用工具

    对开发人员来说,对文件的操作往往必不可少,但可能会有一些陌生的感觉,本文就为大家提供一些可用的工具帮助大家处理各种类型的文档. 音.视频 推荐的工具:FFmpeg, 它提供了录制.转换以及流化音视频的 ...

  2. 【上传文件】基于阿里云的视频点播VOD、对象存储OSS实现音视频图片等文件上传

    一.效果演示 a.测试界面初始化 b.点击[上传视频] c.点击[开始上传] d.点击[上传音频]选择音频之后点击[开始上传] c.点击[上传图片],注意图片上传为单按钮,选择文件之后自动完成上传 d ...

  3. 图片和文件上传js剖析

    /** * 商户资质信息模块js * * 涉及页面组件 { * 上传组件(UploadFileComponent) * } * * * 初始化工具(init) * * @Author:Waver */ ...

  4. 使用jQuery开发一个基于HTML5的漂亮图片拖拽上传web应用

    昨天我们介绍了一款HTML5文件上传的jQuery插件:jQuery HTML5 uploader,今天我们将开发一个简单的叫upload center的图片上传程序,允许用户使用拖拽方式来上传电脑上 ...

  5. H-ui.admin v3.1多图片预览上传的问题解决

    H-ui.admin v3.1多图片预览上传的问题解决 这个模板的多图片上传我搞了好久,之前忙的时候都放弃了模板给的多图片上传,现在有时间研究下终于解决了,话不多说上代码. (function( $ ...

  6. 抖音怎么上传照片图集?抖音照片视频怎么制作?大神教你轻松搞定!

    抖音怎么上传照片图集?抖音照片视频或照片图集怎么制作?现在抖音上很多那种照片或图片做成的短视频,主题好,有音乐,还有文字或好看的切换效果.今天就请大神来教大家简单几步,轻松做一个好看的抖音照片图集!教 ...

  7. 基于cropper和sweetalert的简单图片/头像裁剪上传

    基本功能 前端基本样式: 进行图片裁剪及上传: 点击上传后,js会将截取到的数据转为图片数据利用ajax发送给后台进行存储.存储成功后,刷新前端页面,头像改变. 上传成功后:自动刷新网页,更改头像 基 ...

  8. 图片裁切,上传,自动匹配颜色。

    图片裁切,上传,自动匹配颜色. photoclip插件学习. https://github.com/baijunjie/PhotoClip.js是官方文档. 使用方法很简单.不过我在使用的过程中遇到几 ...

  9. 返回图片_Vue 图片压缩并上传至服务器

    日常开发中经常会遇到上传图片的需求,随着手机的蓬勃发展,现在拍出来的照片分辨率越来越高,随之带来的问题就是图片占用空间越来越大,如果我们直接上传图片可能就会浪费很大一笔资源,本文主要讲解基于 Vue ...

最新文章

  1. 2W+好评,这个python数据分析课程免费开放3天!
  2. pandas Series DataFrame 丢弃指定轴上的项(三)
  3. ActionScript3(AS3)类库学习之(八)——自定义上下文菜单
  4. C# —— 进程与线程的理解
  5. android炫酷叼ui,XUI: 一个简洁而优雅的Android原生UI框架,解放你的双手!
  6. phpcms内容页 ( $inputtime ) 去掉发布时间的时分秒 - 代码篇
  7. 字符串输出为什么第一个没了_「课堂笔记」Python基础语法:变量和输入输出
  8. sql server 2005 T-SQL BACKUP CERTIFICATE (Transact-SQL)
  9. logo下方显示技术支持信息_用“技术支持信息”显示的OEM信息备份修改方法
  10. Python 爬取微博热搜页面
  11. 微信小程序公农历转换的实现
  12. 前端道路上,买书的那些事儿
  13. 红色性格和蓝色性格的优缺点
  14. 一些有趣的软件分享,给生活带来一点乐趣
  15. Java多线程的使用方法,Thread,Runnable
  16. 基于Strongswan的IPSec部署
  17. 2019年高考数学立体几何解题技巧分析策略
  18. android的手机壳,Android手机壳专场,送礼自用两相宜
  19. matlab实现三自由度机械臂旋转
  20. sql2008 1814错误

热门文章

  1. 4G LTE 频段列表
  2. ECA 认证备考指南
  3. 五金机电行业智能渠道商管理平台搭建,构建数字化渠道管理新模式
  4. Git创建、连接远程仓库命令
  5. 什么是 clearfix ?
  6. 求圆环的面积 C语言
  7. VSCode 调试C 配置
  8. repeater 控件ajax绑定数据源,用 DataList 和 Repeater 控件显示数据(C#) | Microsoft Docs...
  9. 谷歌《元宇宙研究报告》、阿里《低代码实战》.pdf 开放下载
  10. java解析wrod带公式带图片