图片&视频上传压缩的考察

本文仅做上传 / 纯客户端压缩功能的调研

上传

  1. 能否在上传时就限制图片的张数?移动端不能使图库变成禁止状态,用户点击完成之后才能进行校验。

  2. 能否限制上传的文件格式?可以限制,PC端能够完美限制,移动端只能部分限制,限制上传图片,IOS会将txt等文件禁用,但是安卓机不会,仍然能上传txt,手机上传中会无accept='image/jpeg,image/jpg,image/png属性。

    选择之后必须再进行校验提示。

    可考虑做移动 / PC端不同配置。

  3. 实现方式

    采用<input type='file' multiple='multiple' />实现,不限制格式。

    参考https://tinypng.com/。

安卓机上表现:可以选择相册、照片、文件,但是外层一次只能选择一张,进入图库内层可以选择多张。

IOS上表现:可以正常选择多张。

采用<input type='file' accept='image/*,video/*' multiple onChange={onChange} />实现。

调用样式IOS正常,安卓先要选择文件,才能调用相册。

  1. 上传过程可使用axios的onUploadProgress获取上传进度。

视频压缩

压缩工具

  • fluent-ffmpeg:一个用于处理和压缩视频的npm包,支持多种视频格式,如MP4、MOV、AVI等。
  • ffmpeg.wasm
    不考虑wasm,纯前端方式无法压缩视频,需要传到服务端再压缩。

压缩参数

  • 帧率:指的的视频每秒钟播放的图片数目,帧率越小,那么你看到的视频就会越卡,动作就不连贯。一般25fps是常用的视频尺寸。
  • 码率(比特率):就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒,通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,当然不是越大越好。这样只会增加数据量,浪费内存。
  • 分辨率:就是视频的尺寸大小,如标准的720P视频就是每一横排有1280个像素,每一列有720个像素,总的像素就是1280x720个,这个乘积即是视频的分辨率。一般情况下,分辨率越大,视频就越清晰。清晰度由码率决定,视频尺寸和像素量由分辨率决定。码率越高越清晰(前提是分辨率保持不变),分辨率越大视频尺寸越大。

mp4视频文件压缩率大概是多大:https://blog.csdn.net/xiaozaq/article/details/109378302

  1. 以码率5M为准,1s 24帧
  • 20s:
    视频大小:20s*5Mb = 100Mb , 100 / 8 = 12.5 MB ,大概12.5M。
  • 30s:
    视频大小:大概18.75 MB。
  1. 以码率3M为准
  • 20s:20*3/8=7.5M。
  • 30s:30*3/8=11.25M。

参考网站

  1. 亚马逊
  • 上传限制100M ,10分钟内。
  • 格式avi / flv / mov / mpg / wmv
  1. OPPO
    下载视频5.2MB,16s,720p
    码率:5.2MB / 15s ≈ 346,667 bps ≈ 0.35MB。
  2. SONY
    上传至第三方视频网站Youtube,不考虑压缩问题。
  3. 其他
    上传到服务器压缩,比如阿里云,或者后端找工具实现。
    假设限制视频的大小是100MB,20s,视频码率大概是40M
    如果30秒,则视频码率大概是 100 MB * 8 / 30 s = 26.7 M

图片压缩画质 & 最大上传限制 & 压缩工具

存储方案

  1. 原图压缩,只存储一张压缩的原图,小图的展示压缩通过阿里云提供自动裁剪方式实现。
    阿里云的压缩文档:https://help.aliyun.com/document_detail/44688.html?spm=5176.8465980.quota-list.1.6aff1450PcUeZX
    注意点:
  2. 可支持压缩png , jpg格式(由压缩工具决定),压缩完毕后图片格式仍然保留。
  3. 最终采用:图片存储一张压缩后的原图、一张canvas裁剪后的正方形预览图,数据库保存两个版本的url数据,届时可直接获取。

压缩工具

  1. canvas压缩,canvas提供toBlob的压缩canvas.toDataURL('image/jpeg', quality) 压缩算法由浏览器内部实现,不同浏览器实现不同。(除了算法压缩、尺寸压缩也是一个压缩标准)
  2. 其他涉及第三方压缩服务器、仅供服务器使用的依赖暂不考虑。
  • imagemin
  • sharp
  1. wasm的压缩工具- 暂不考虑。
canvas压缩效果

以谷歌 PC为例测试canvas压缩效果:(长宽不变)

  • JPG1:508.11k

    1:567k

    0.9:131K

    0.8:87.8K

  • JPG2:700K

    1: 768K

    0.9: 174k

    0.8: 117K

    0.6: 77.9k

  • webp:webp可以压缩,效果类比jpg

  • PNG 224k 只能通过调整尺寸压缩

    1: 231k

    0.9: 231k

    0.8: 231K

?????看完png我就是一个皱眉,啊?canvas压缩png原来这么拉?那看来canvas压缩不能用了。

参考网站

  1. goPro
  • 压缩图仅13K,上传时做了自动裁剪,取中间的正方形。
  • 下载原图600K,不能识别压缩比例。
    OPPO
  • 阿里云自动裁剪方案,不确定是否压缩。

错误处理

  1. 超时错误。
  2. 上传失败错误。(服务器错误)
  3. 格式尺寸错误(客户端错误)
相关推荐
天外飞雨道沧桑10 分钟前
详解CSS中的Containing Block:概念、规则与实战解析
前端·css
彩票管理中心秘书长14 分钟前
Git 图形化交互工具大全:从官方 GUI 到高级扩展
前端
ID_1800790547317 分钟前
Python 实现京东商品详情 API 数据准确性校验(极简可直接用)
java·前端·python
前端那点事17 分钟前
Vue生命周期速查:Vue2+Vue3钩子全解析,新手也能秒懂
前端·vue.js
陆枫Larry20 分钟前
横向滚动列表紧贴屏幕边缘问题:原理分析与解决方案
前端
JuliusDeng20 分钟前
02. 环境搭建
前端
练习时长一年37 分钟前
@NotEmpty注解引发的报错
java·服务器·前端
AI服务老曹1 小时前
【架构深评】深度解析异构计算下的 AI 视频管理平台:从 GB28181 接入到 X86/ARM 容器化部署的全链路实战
人工智能·架构·音视频
郝学胜-神的一滴1 小时前
[力扣 227] 双栈妙解表达式计算:从思维逻辑到C++实战,吃透反向波兰式底层原理
java·前端·数据结构·c++·算法
淼淼爱喝水1 小时前
基于DOM型XSS漏洞与利用实验教程
前端·xss·dom·dvwa