当前位置:首页 > 闲鱼技术 > 正文内容

短视频宝贝=慢?阿里巴巴工程师这样秒开短视频

xianyu3年前 (2021-03-06)闲鱼技术255

作者:闲鱼技术-邻云

微信号:pps688888
添加微信, 免费测试软件
复制微信号

前言

随着短视频兴起,各大APP中短视频随处可见,feeds流、详情页等等。怎样让用户有一个好的视频观看体验显得越来越重要了。大部分feeds里面滑动观看视频的时候,有明显的等待感,体验不是很好。针对这个问题我们展开了一波优化,目标是:视频播放秒开,视频播放体验良好。无图无真相,上个对比图,左边是优化之前的,右边是优化之后的:

compare.gif

问题分析

视频格式的选择

在正式分析问题之前有必要说明下:我们现在首页的视频,都是320p H.264编码的mp4视频。

  • H.264 & H.265
  • TS & FLV & MP4

TS是日本高清摄像机拍摄下进行的封装格式,全称为MPEG2-TS。TS即”Transport Stream”的缩写。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。下述命令可以把mp4转换成ts格式,从结果来看ts文件(4.3MB)比mp4文件(3.9MB)大10%左右。

FLV是FLASH VIDEO的简称,FLV流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等问题。FLV只支持一个音频流、一个视频流,不能在一个文件里包含多路音频流。音频采样率不支持48k,视频编码不支持H.265。相同编码格式下,文件大小和mp4几乎没有区别。

MP4是为大家所熟知的一种视频封装格式,MP4或称MPEG-4第14部分是一种标准的数字多媒体容器格式。MPEG-4第14部分的扩充名为.mp4,以存储数字音频及数字视频为主,但也可以存储字幕和静止图像。因其可容纳支持比特流的视频流,MP4可以在网络传输时使用流式传输。其兼容性很好,几乎所有的移动设备都支持,而且还能在浏览器、桌面系统进行播放。综合上面几个封装格式的特点,我们的最终选择是MP4.

播放流程

一个视频在客户端的播放流程是怎么样的?播放首开慢耗时在什么地方?耗时点是否能够快速低成本的解决?了解视频的播放流程有助于找到问题的突破口。视频从加载到播放可以分为三个阶段:

  • 读取(IO):“获取” 内容 -> 从 “本地” or “服务器” 上获取
  • 解析(Parser):“理解” 内容 -> 参考 “格式&协议” 来 “理解” 内容
  • 渲染(Render):“展示” 内容 -> 通过扬声器/屏幕来 “展示” 内容
image.png

可以看出内容获取从“服务器”改为“本地”,这样会节省很大一部分时间,而且成本很低,是一个很好的切入点。事实也是如此,我们的优化正是围绕此点展开。

PS: 我们使用的网络库,播放器都是集团内部的,本身做了很多优化。本文不涉及网络协议,播放器方面的优化讨论。

技术方案

鉴于上面的分析,我们要做的工作是:把mp4文件提前缓存一部分,到feeds滑动要播放的时候,播放本地的mp4文件。由于用户可能继续观看视频,所以本地的数据播放完后,需要从网络下载数据进行播放。这里需要解决两个问题:

  • 应该提前下载多少数据
  • 缓存数据播放完成后该怎么切换到网络数据
MOOV BOX的位置
image.png

对于第一个问题,我们不得不分析一下mp4的文件结构,看看我们应该下载多少数据量合适。MP4是由很多Box 组成的,Box里面可以嵌套Box:

这里不详细介绍MP4的格式信息。但是可以看出moov box对播放很关键,它提供的信息如:宽高、时长、码率、编码格式、帧列表、关键帧列表等等。播放器没有获取到moov box是没办法进行播放的。所以下载的数据应该要包含moov box再加上几十帧的数据。

做了一个简单的计算:闲鱼短视频一般最长是30s,feeds里面的分辨率是320p,码率是1141kb/s,ftyp+moov这个视频的数据量在31kb左右(打开文件可以看出mdat是从31754byte的位置开始的),所以,头部信息+10帧的数据大约是:(31kb + 1141kb/3)/8=51KB

Proxy

第二个问题:缓存数据播放完成后该怎么切换到网络数据呢?在本地数据播放完成之后,设置一个网络地址给播放器,告诉播放器下载的offset是多少,然后继续从网络下载数据播放。这样看起来可行,但是需要播放器提供支持:本地数据播放完成的回调;设置网络url并支持offset。另外,服务端需要支持range参数,而且切换到网络播放的时候需要新建立网络连接,很可能会造成卡顿。

image.png

最终,我们选择了proxy的方式,把proxy作为中间人,负责预加载数据、给播放器提供数据,切换逻辑在proxy里面来完成。未加入proxy之前流程是这样的:

image.png

加入了proxy之后流程是这样的:

image.png

这样做的好处很明显,我们可以在proxy里面做很多事情:例如本地文件缓存数据和网络数据的切换工作。甚至是和CDN使用其它的协议进行通信。我们这里假定预加载工作已经完成,看看播放器是怎么和proxy进行交互的。播放的时候会用Proxy提供的一个localhost的url进行播放,这样代理服务器会收到网络请求,把本地预加载的数据返回给播放器。播放器完全感知不到proxy模块、预加载模块的存在。播放器、预加载模块都是Proxy的client,调用逻辑都是一样。图示说明如下:

下面逐步解释一下,数据的加载过程:

  • Client发起http请求获取数据,箭头1所示
  • 文件缓存如果存在所请求的数据则直接返回数据,箭头2所示
  • 若本地文件缓存数据不够,则发起网络请求,向CDN请求数据,箭头3所示
  • 获取网络数据,写入文件缓存,箭头4所示
  • 返回请求的数据给Client,箭头2所示

实现模块

预加载模块

确定了技术方案后,预加载模块还是有很多工作要做的。在列表网络数据解析完成后会触发视频预加载,首先会根据url生成md5值,然后去查看这个md5值对应的任务是否存在,如果存在则不会重复提交。生成任务后会提交到线程池,在后台线程进行处理。网络从Wifi切换到3G的时候,会把任务取消,防止消耗用户的数据流量。

image.png

预加载任务在线程池执行的时候,其流程是这样的:首先会获取一个本地代理的url。然后发起http请求。Proxy会收到http请求进行处理,开始做真正的数据预加载工作。预加载模块读取到指定的数据量后终止。到此,预加载的任务就已完成。流程图如下所示:

在用户快速滑动的时候,怎么能保证视频还能继续秒开呢?预加载模块对于每一个任务都会维护一个状态机,在Fling的时候会把划过的任务暂停下,把最新要显示的任务优先级提高,让其优先执行。

Proxy模块

Proxy内部有个local的httpServer负责拦截播放器和预加载模块的http请求。client在请求时会带入CDN的url,在本地缓存数据没有的时候会去CDN获取新鲜数据。因为有多个地方向Proxy请求数据,所以用线程池来处理多个client的连接很有必要,这样多个client可以并行,不会因为前面有client在请求而阻塞。文件缓存使用LruDiskCache,在超过指定文件大小后,老的缓存文件会删除,这是一个在使用文件缓存时很容易忽视的问题。由于我们的场景视频是连续播放的,不存在seek的情况,所以文件缓存相对比较简单,不用考虑文件分段的情况。Proxy内部对于同一个url会映射到一个client,如果预加载和播放同时进行,数据只会有一份,不会去重复下载数据。再来一个Proxy内部构造示意图:

image.png
遇到的问题

在测试中发现,有的视频还是会播放很慢,仔细查看本地的确缓存了期望的数据大小,但是播放的时候还是有较长的等待时间,这种视频有个特点:moov box在尾部。对于moov在尾部的视频,是整个文件都下载完成后才进行播放的,原因是moov box里面存了很多关键信息,前面分析mp4格式的时候有提到。对于这个问题有两个解法:

  • 解法一:

服务端在进行转码的时候保证moov的头部在前面,发现moov位置不正确的视频服务端进行订正。

PS:查看moov在文件中的位置可以用hex文本编辑器打开,按字符搜索moov所在的位置即可,MAC上面还可以使用MediaParser , 另外还可以用ffmpeg命令生成moov在头部或者尾部的mp4文件。

  • 解法二

不用修改moov box的位置,而是在播放端进行处理,播放端需要检测流信息,如果moov前面没有,就去请求文件的尾部信息。具体就是:发起 HTTP MP4 请求,读取响应 body 的开头,如果发现 moov 在开头,就接着往下读mdat。如果发现开头没有,先读到 mdat,马上 RESET 这个连接,然后通过 Range 头读取文件末尾数据,因为前面一个 HTTP 请求已经获取到了 Content-Length ,知道了 MP4 文件的整个大小,通过 Range 头读取部分文件尾部数据也是可以的。示意图如下

image.png

这个方案的缺点是:对于moov box在尾部的视频会多两次http connection。

结语

本文介绍了常见的视频编码格式,视频封装格式,介绍了moov头信息对于视频播放的影响。随着对于播放流程的分析,我们找到了问题的切入点。简单说就是围绕着数据预加载展开,把网络请求数据的工作提前完成,播放的时候直接从缓存读取,而且后续的视频回看都是从缓存读取,不仅解决了视频初始化播放慢的问题,还解决了播放缓存问题,可以说是一箭双雕。Proxy是这个方案的核心思想,本地localhost的url是一个关键纽带,视频预加载模块和播放器模块解耦彻底,换了播放器照样可以使用。到此为止,视频feeds秒开优化就已完成。上线后的数据来看视频打开速度在800ms左右。

回过头来,或许我们还可以更进一步,可以对预加载收到的数据进行验证,确保缓存了准确的信息,而不是固定的数值。还可以进行更加深度的优化,让用户观看视频的体验更加顺滑。

参考文献

<

扫描二维码推送至手机访问。

版权声明:本文由中客网络发布,如需转载请注明出处。

本文链接:http://www.zzzmc.cc/26.html

分享给朋友:

相关文章

闲鱼自动发布软件怎么用?平台如何发布产品?

闲鱼自动发布软件怎么用?平台如何发布产品?

  很多人在使用闲鱼平台时,其实都会选择使用自动发布软件,因为这种产品可以帮助店家24小时上传产品。但是有一部分新手因为刚刚接触可能并不是特别的了解,就比如说去哪里下载,该怎样使用等等并不是很清楚。今天就一起看一下闲鱼自动发布软件该怎么用,平台上又是怎样发布产品的。   闲鱼自动发布软件用法   首先用户可以在自己的百度云里面去下载软件,下载完之后可以把压缩包进行压减。其次,然后可以在百度上直接搜索NET4.0,一定要把这个软件下载下来,要不然可能根本运行不起来。在压解完之后,可以把下面的文件夹打开,双击点击登录,然后注册好软件。在登录之后就可以看到软件的页面了,然后可以点击新建模...

闲鱼流量突然降低了,该怎么解决呢!

闲鱼流量突然降低了,该怎么解决呢!

  【小千记】如果我们遇到这种问题,那么我们该怎么解决呢?   首先,我们是要找到自己被降权的原因,然后在一段时间内不去违规操作,慢慢养号,等待流量恢复,我们可以通过以下几点进行操作。   第一点、提升信用   信用分和权重是挂勾的,如果说你的信用分值很低,在闲鱼里面是不会有太大的权重,当然这也是大部分正常情况下。另外在客户看来信用分值低的店铺,直接可能就不会理会,原因很简单,信不过你的产品质量。所以账号一定要有一个较高的信誉度,分值高的店铺就会给人带来一定的好感,这非常现实,尽量将自己的店铺以及个人资料整理齐全,提升自己的信誉度,对你提升权重有很大帮助!   【小千记...

闲鱼技巧,怎么提高自己的排名

闲鱼技巧,怎么提高自己的排名

  【闲鱼批量上架软件】随着闲鱼商家入驻的越来越多,新手小白也很多,但是很多的新手小白都不知道闲鱼怎么去提高自己的排名,没有排名就比不过其他的竞争对手,所以闲鱼的排名是很重要的,今天我就来分享一下怎样提高自己的闲鱼排名。   我们闲鱼的排名是根据自己的账号来给的,如果登录闲鱼的账号,芝麻信用很高,那自然而然的,自己发布的商品排名也会高,但是如果自己的信誉分很低,那商品排名也会很低。所以我们应该选择一个芝麻信用比较高的账号,来开通我们的闲鱼账号。   【闲鱼批量上架软件】每一个闲鱼宝贝的左下角都有一个超赞,当浏览你的人多了,点超赞的人也多了,闲鱼就会给你一个头衔,那这样我们的商品排名...

怎么才能做好闲鱼账号

怎么才能做好闲鱼账号

  自己新开一个咸鱼账号,但是如何经营它呢?这也需要很多的实践和理论相结合的去学习。   第一个就是找到一个商品,找到之后发布这个商品,如果你的商品上架之后,别人赞过你的商品,或者给你留言,这都可以增加你的浏览量,然后让你的商品上推荐。但是不要卖一些违规的商品,或者是虚拟的商品,还有一些假货,所以如果你要想在闲鱼上运营,就必须去遵守闲鱼的规则。一定要有耐心,因为新开一个账号的话,首先它的年限没有这么长,而且虽说浏览量都是平均的吧,但是你的信用度或者权重不高,你的流量也不会太多。   第二个就是如何给自己的商品做客服,要知道,有一些他们并不是很想买,但就是想要问问的人,你可以通过一个...

闲鱼开店必备小妙招,你值得拥有

闲鱼开店必备小妙招,你值得拥有

  你一定没有听说过闲鱼开店也有小妙招吧?各行各业都有属于它自己的诀窍和小妙招,同样闲鱼也有。闲鱼开店有哪些小妙招呢?下面就让我来为你介绍一下。   妙招一:不要进行发布违禁商品。违禁商品被禁言或者可以直接被封号,如果被禁言的话,你的店铺设计流量会呈直线下跌;如果被封号的话,你的信誉会受到社会影响。所以我们一定时间不要自己发布违禁商品。哪些问题商品销售违禁了呢?   一:虚拟类。   二:违反法律类。   三:药品类。   一定不要在闲鱼上卖这三类进行物品,如果你卖了,那么你的账号一定会被禁封。   妙招二:时刻进行关注学生自己的闲鱼动向。   如果你...

闲鱼怎样提高排名?_闲鱼浏览量_闲鱼流量暴增系统_闲大师版闲鱼助手_闲鱼增加浏览量曝光率

闲鱼怎样提高排名?_闲鱼浏览量_闲鱼流量暴增系统_闲大师版闲鱼助手_闲鱼增加浏览量曝光率

  【闲鱼浏览量】闲鱼怎样提高排名?      2020年11月10日   闲鱼浏览量   42 views   0   很多在闲鱼上卖货的卖家都不会没有注意到学生自己的闲鱼排名。闲鱼排名世界是什么呢?你可以同时将你的商品进行链接信息分享给朋友,用朋友的账号需要打开该链接,如果你用朋友的账号,能够在首页上搜索到你的店铺销售商品管理的话,那么我们说明你的闲鱼排名还不错。如果教师不能通过搜索到你的商品经济的话,那么你就应该不断提高你的闲鱼排名了。   我们怎样才能提高游手好闲的鱼的等级呢? 让我来分享一下我的方法。   首先,你可以通过提高你的芝麻信...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。