-
Client发起http请求获取数据,箭头1所示
-
文件缓存如果存在所请求的数据则直接返回数据,箭头2所示
-
若本地文件缓存数据不够,则发起网络请求,向CDN请求数据,箭头3所示
-
获取网络数据,写入文件缓存,箭头4所示
-
返回请求的数据给Client,箭头2所示
确定了技术方案后,预加载模块还是有很多工作要做的。在列表网络数据解析完成后会触发视频预加载,首先会根据url生成md5值,然后去查看这个md5值对应的任务是否存在,如果存在则不会重复提交。生成任务后会提交到线程池,在后台线程进行处理。网络从Wifi切换到3G的时候,会把任务取消,防止消耗用户的数据流量。
预加载任务在线程池执行的时候,其流程是这样的:首先会获取一个本地代理的url。然后发起http请求。Proxy会收到http请求进行处理,开始做真正的数据预加载工作。预加载模块读取到指定的数据量后终止。到此,预加载的任务就已完成。流程图如下所示:
在用户快速滑动的时候,怎么能保证视频还能继续秒开呢?预加载模块对于每一个任务都会维护一个状态机,在Fling的时候会把划过的任务暂停下,把最新要显示的任务优先级提高,让其优先执行。
Proxy内部有个local的httpServer负责拦截播放器和预加载模块的http请求。client在请求时会带入CDN的url,在本地缓存数据没有的时候会去CDN获取新鲜数据。因为有多个地方向Proxy请求数据,所以用线程池来处理多个client的连接很有必要,这样多个client可以并行,不会因为前面有client在请求而阻塞。文件缓存使用LruDiskCache,在超过指定文件大小后,老的缓存文件会删除,这是一个在使用文件缓存时很容易忽视的问题。由于我们的场景视频是连续播放的,不存在seek的情况,所以文件缓存相对比较简单,不用考虑文件分段的情况。Proxy内部对于同一个url会映射到一个client,如果预加载和播放同时进行,数据只会有一份,不会去重复下载数据。再来一个Proxy内部构造示意图:
在测试中发现,有的视频还是会播放很慢,仔细查看本地的确缓存了期望的数据大小,但是播放的时候还是有较长的等待时间,这种视频有个特点:moov box在尾部。对于moov在尾部的视频,是整个文件都下载完成后才进行播放的,原因是moov box里面存了很多关键信息,前面分析mp4格式的时候有提到。对于这个问题有两个解法:
- 解法一:
服务端在进行转码的时候保证moov的头部在前面,发现moov位置不正确的视频服务端进行订正。
PS:查看moov在文件中的位置可以用hex文本编辑器打开,按字符搜索moov所在的位置即可,MAC上面还可以使用MediaParser , 另外还可以用ffmpeg命令生成moov在头部或者尾部的mp4文件。
例如:
从1.mp4 copy一个文件,使其moov头在尾部
json
ffmpeg -i 1.mp4 -c copy -f mp4 output.mp4
从1.mp4 copy一个文件,使其moov头在头部:
json
ffmpeg -i 1.mp4 -c copy -f mp4 -movflags faststart output2.mp4
- 解法二
不用修改moov box的位置,而是在播放端进行处理,播放端需要检测流信息,如果moov前面没有,就去请求文件的尾部信息。具体就是:发起 HTTP MP4 请求,读取响应 body 的开头,如果发现 moov 在开头,就接着往下读mdat。如果发现开头没有,先读到 mdat,马上 RESET 这个连接,然后通过 Range 头读取文件末尾数据,因为前面一个 HTTP 请求已经获取到了 Content-Length ,知道了 MP4 文件的整个大小,通过 Range 头读取部分文件尾部数据也是可以的。示意图如下
这个方案的缺点是:对于moov box在尾部的视频会多两次http connection。
本文介绍了常见的视频编码格式,视频封装格式,介绍了moov头信息对于视频播放的影响。随着对于播放流程的分析,我们找到了问题的切入点。简单说就是围绕着数据预加载展开,把网络请求数据的工作提前完成,播放的时候直接从缓存读取,而且后续的视频回看都是从缓存读取,不仅解决了视频初始化播放慢的问题,还解决了播放缓存问题,可以说是一箭双雕。Proxy是这个方案的核心思想,本地localhost的url是一个关键纽带,视频预加载模块和播放器模块解耦彻底,换了播放器照样可以使用。到此为止,视频feeds秒开优化就已完成。上线后的数据来看视频打开速度在800ms左右。
回过头来,或许我们还可以更进一步,可以对预加载收到的数据进行验证,确保缓存了准确的信息,而不是固定的数值。还可以进行更加深度的优化,让用户观看视频的体验更加顺滑。
Android音视频开发入门到精通
以下音视频学习路线及学校笔记PDF电子书版可在我的GitHub免费下载,记得给个Star哦~
快速入手通道:(点这里)群文件免费下载获取。
=======================================================================
一 绘制图片
1. ImageView 绘制图片
2. SurfaceView 绘制图片
3. 自定义 View 绘制图片
二、AudioRecord API详解
三、使用 AudioRecord 实现录音,并生成wav
-
创建一个AudioRecord对象
-
初始化一个buffer
-
开始录音
-
创建一个数据流,一边从AudioRecord中读取声音数据到初始化的buffer,一边将buffer中数据导入数据流。
-
关闭数据流
-
停止录音
四、用 AudioTrack 播放PCM音频
1.AudioTrack 基本使用
2.AudioTrack 详解
3. AudioTrack 与 MediaPlayer 的对比
五、使用 Camera API 采集视频数据
1.预览 Camera 数据
2.取到 NV21 的数据回调
六、使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件
1.MediaExtractor API介绍
2.MediaMuxer API介绍
3.使用情境
七. MediaCodec API 详解
1.MediaCodec 介绍
2.MediaCodec API 说明
3.MediaCodec 流控
由于文章篇幅受限,剩余内容过多,文中插图有限,下文只能截图目录展示:
=======================================================================
-
Android OpenGL ES 开发(一): OpenGL ES 介绍
-
Android OpenGL ES 开发(二): OpenGL ES 环境搭建
-
Android OpenGL ES 开发(三): OpenGL ES 定义形状
-
Android OpenGL ES 开发(四): OpenGL ES 绘制形状
-
Android OpenGL ES 开发(五): OpenGL ES 使用投影和相机视图
-
Android OpenGL ES 开发(六): OpenGL ES 添加运动效果
-
Android OpenGL ES 开发(七): OpenGL ES 响应触摸事件
-
Android OpenGL ES 开发(八): OpenGL ES 着色器语言GLSL
-
Android OpenGL ES 开发(九): OpenGL ES 纹理贴图
-
Android OpenGL ES 开发(十): 通过GLES20与着色器交互
-
使用 OpenGL 显示一张图片
-
GLSurfaceviw 绘制 Camera 预览画面及实现拍照
-
使用OpenGL ES 完成视频的录制,并实现视频水印效果
=====================================================================
-
深入学习音视频编码,如H.264,AAC,研究使用开源编解码库,如x.264,JM 等
-
深入研究音视频相关的网络协议,如 rtmp,hls,以及封包格式,如:flv,mp4
-
深入学习一些音视频领域的开源项目,如 webrtc,ffmpeg,ijkplayer,librtmp 等等
-
将 ffmpeg 库移植到 Android 平台,结合上面积累的经验,编写一款简易的音视频播放器
-
将 x264 库移植到 Android 平台,结合上面积累的经验,完成视频数据 H264 软编功能
-
将 librtmp 库移植到 Android 平台,结合上面积累的经验,完成 Android RTMP 推流功能
音视频编解码技术
-
音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准
-
音视频编解码技术(二):AAC 音频编码技术
流媒体协议
-
流媒体协议(一):HLS 协议
-
流媒体协议(二):RTMP协议
多媒体文件格式
-
多媒体文件格式(一):MP4 格式
-
多媒体文件格式(二):FLV 格式
-
多媒体文件格式(三):M3U8 格式
-
多媒体文件格式(四):TS 格式
-
多媒体文件格式(五):PCM / WAV 格式
==========================================================================
-
FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe
-
FFmpeg命令行工具学习(二):播放媒体文件的工具ffplay
-
FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg
-
FFmpeg命令行工具学习(四):FFmpeg 采集设备
-
FFmpeg命令行工具学习(五):FFmpeg 调整音视频播放速度
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer !如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
片转存中…(img-mPiyFNJ3-1712079237784)]
最后
希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer !如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
[外链图片转存中…(img-Rp7xuSL5-1712079237784)]