2024年最全android文件上传优化分享(切片上传),android面试常问

Android高级架构师

由于篇幅问题,我呢也将自己当前所在技术领域的各项知识点、工具、框架等汇总成一份技术路线图,还有一些架构进阶视频、全套学习PDF文件、面试文档、源码笔记。

  • 330页PDF Android学习核心笔记(内含上面8大板块)

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

  • Android BAT部分大厂面试题(有解析)

好了,以上便是今天的分享,希望为各位朋友后续的学习提供方便。觉得内容不错,也欢迎多多分享给身边的朋友哈。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

切片代码底层使用JDK的RandomAccessFile对文件提供数据读取

经测试,上传的瓶颈在于上行带宽,所以切片、上传时单线程任务,不会出现10个切片一起上传的情况。

切片目前设定为10MB一片,上传时,把当前的块的数据读取到内存中进行上传

切片步骤

  1. 对文件md5计算,向服务端校验文件是否已存在,是则提前结束

  2. 对文件进行切片,计算每片的md5值用于校验是否已上传。比如38mb的视频,限定每片最大10mb,切出4片,最后一片8mb,其余10mb。


                    FileChannel fc = new RandomAccessFile(mSourceFile, "r").getChannel();

                    MappedByteBuffer byteBuffer;



                    for (int i = 0; i < mBlockCount; i++) {

                        long leftBlockSize = Math.min(mSourceFile.length() - i * mBlockSize, mBlockSize);

                        byteBuffer = fc.map(FileChannel.MapMode.READ_ONLY, i * mBlockSize, leftBlockSize).load();

                        mResultArray.add(new BlockInfoModel("", MD5Util.md5(byteBuffer), i));

                    }

                    fc.close();



  1. 批校验文件的切片md5值, 记录没有被上传过的切片下标,循环从源文件读取对应数据切片进行上传。切片数据流读到内存中性能最佳,但是需要谨慎考虑OOM问题;数据流保存到磁盘中,再循环每次1MB的读取比较稳健,但是性能稍差。本次重构提供了这两种切片方式都可以选择

  2. 所有数据切片上传成功后,向服务端发起一次文件合并请求,成功则结束,否则跳到步骤3。

chapter 2.媒体压缩

==============

对于媒体资源来说,压缩就是在保证用户体验的情况下,尽可能地抹去用户感官之外的细节,达到降低文件尺寸的目的

1.音频的无损格式ape、flv 压缩到有损格式的Mp3,就是抹去了人听觉之外的音频细节

2.图片视频经过压缩,虽然放大N倍看细节会变得模糊,但是正常浏览下是可以接受的

举个例子

针对 1920*1080的屏幕截图,经过压缩后尺寸不变,但是降低采样率,文件体积从1MB降低到了200KB

图片压缩.png

压缩前.png

压缩后.png

图片压缩

压缩算法参考鲁班

通过等比例降低图片的采样率、分辨率、压缩质量等关键因素,大幅度减少输出的像素点数量,达到降低图片的体积的目的

在不影响浏览体验的前提下,能很大比例压缩图片体积

鲁班跑分.png

视频压缩

通过降低视频的分辨率、码率等关键因素,降低视频的体积。

压缩方案可选1:第三方so库FFmpeg软解 2:使用安卓原生MediaCodec 硬解

因为压缩效率、引入体积等问题,我们选择了MediaCodec方案

我们采用的压缩策略是分辨率450*800,码率是1.5M

视频压缩UML.png

在选择微信作为对比标杆的情况下,我们达到了这个标准

压缩结果.png

视频压缩UI

视频压缩1.png

视频上传1.png

总结

通过这两个阶段的重构,安卓端的上传模块初步形成了一个完整的体系,能够满足产品的使用需求,被广泛的应用到各个产品线的业务模块中。

备注

码率

码率是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。

通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件

1920x1080分辨率的视频,码率应该在8Mb以上。

1080x720的分辨率,应该在5Mb左右

720x576分辨率,应该在3Mb左右

640x480分辨率,应该在1.5Mb左右

320x240的分辨率,应该在600Kb左右。

结尾

我还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值