Short video baby=阿里巴巴工程师在这一秒内打开短视频

频道:闲鱼技术 日期: 浏览:641
作者:idle fish技术-邻近云

微信号:ccjun91
添加微信群,试用软件
复制微信号

前言

随着短视频的兴起,短视频在主流应用中随处可见,如feed-stream、detail-page等。如何让用户拥有良好的视频观看体验变得越来越重要。大多数人在看视频时都有一种明显的等待感,这种体验不是很好。目标是在一秒钟内优化视频播放。没有照片,就没有真相。在前面的对比图中,左边是优化前,右边是优化后:

问题分析

视频格式的选择

在正式分析问题之前,有必要解释一下,我们主页上的视频是每小时320便士。2.6.4编码MP4视频。

h 2 6 4和h。2.6.5 t s、f l v和m p 4

TS是日本高清相机采用的包装格式,全称为MPEG2-TSTS是“运输流”的缩写。MPEG2-TS格式的特点是可以独立于任何视频流段进行解码。以下命令可以将m p4转换为t s格式。从结果来看,TS文件(4.3MB)比MP4文件(3.9MB)大约10%。

FLV是FLASH视频的缩写。FLV流媒体格式是随着最初的介绍而开发的一种视频格式。因为它形成的文件非常小,加载速度非常快,所以可以在网络上观看视频文件。它的出现有效地解决了视频文件导入flash后,导出的swf文件庞大,无法在网络上很好地使用的问题。

 

FLV只支持一个音频流和一个视频流,不能在一个文件中包含多个音频流。音频采样率不支持4 8 k视频编码,也不支持h 2 6 5。在相同的编码格式下,文件大小和MP4几乎没有区别。

MP4是一种众所周知的视频打包格式。mp 4或mp e g-4 part 14是一种标准的数字多媒体容器格式。MPEG-4第14部分的扩展是MP4主要存储数字音频和数字视频,但它也可以存储字幕和静态图像。因为MP4可以容纳支持比特流的视频流,所以它可以在网络传输中使用流传输。它的兼容性非常好。几乎所有的移动设备都支持它,而且它可以在浏览器和桌面系统中播放。考虑到以上包装形式的特点,我们最终选择了MP4。

回放过程

客户端上的视频播放过程是什么?第一次慢启动需要在哪里进行?能否以低成本快速解决耗时点?了解视频播放过程有助于找到突破。视频从加载到播放可分为三个阶段:

阅读(IO):“获取”内容->从“本地”或“服务器”获取解析(解析器):“理解”内容->参考“格式和协议”以“理解”内容呈现(呈现):“显示”内容->使用扬声器/屏幕“呈现”内容

可以看出,内容获取已从“服务器”更改为“本地”,这将节省大量时间和低成本。这是一个很好的切入点。事实上,我们的优化是围绕这一点进行的。

postscript:我们使用的网络库和播放器都在团队内部,我们进行了大量优化。本文不涉及网络协议和播放器的优化讨论。

技术方案

鉴于上述分析,我们需要做的是提前缓存部分m p4文件,并在准备播放时播放本地m p4文件。由于用户可能会继续观看视频,他们需要在播放本地数据后从网络下载数据进行播放。需要解决两个问题:

应该提前下载多少数据?数据回放后如何切换到网络数据

木箱的位置

对于第一个问题,我们必须分析MP4的文件结构,看看我们应该下载多少数据。MP4由许多盒子组成,盒子可以嵌套在其中:

这里不详细介绍MP4的格式信息。然而,可以看出,木箱对于游戏来说非常重要。它提供宽度、高度、持续时间、编码速率、编码格式、帧列表、关键帧列表等信息。玩家不拿到木箱就不能玩。因此,下载的数据应该包括木箱和几十帧数据。

做了一个简单的计算:最长的自由鱼短视频通常是30年前的,提要中的分辨率是320p,编码速率是1141kb/s,f t y p mo o v的数据量大约是31kb(打开文件,你可以看到md a t从31754字节开始)。因此,10帧报头信息的数据是关于:(3 1kb 1 4 1kb/3)/8=5 1kb

代理人

第二个问题:播放缓存数据后如何切换到网络数据?本地数据回放完成后,为播放器设置网络地址,告诉播放器下载了多少偏移量,然后继续从网络下载数据。这似乎是可行的,但需要播放器的支持:完成本地数据回放的回调;此外,服务器需要支持范围参数,切换到网络播放时需要建立新的网络连接,这可能会造成干扰。

最后,我们选择了代理方法,以代理为中介,负责预加载数据并向玩家提供数据,并在代理中完成切换逻辑。加入代理前,流程如下:

添加药剂后,流程如下:

这样做的好处是显而易见的。我们可以在代理中做很多事情:例如,在本地文件缓存数据和网络数据之间切换。甚至使用其他协议与CDN通信。让我们假设玩家和代理已经在这里完成了交互。播放时,将使用代理提供的本地服务器的网址进行播放,以便代理服务器接收网络请求并将本地预加载的数据返回给播放器。玩家完全不知道代理模块和预加载模块的存在。播放器和预加载模块是代理,客户呼叫逻辑相同。图示如下:

数据加载过程将在下面逐步解释:

客户发起h t p数据请求,箭头1如果请求的数据存在于所示的文件缓存中,数据将直接返回,箭头2如果本地文件缓存数据不足,则发起网络请求从c d n请求数据,箭头3获取网络数据,如所示,并将其写入文件缓存,箭头4将请求的数据返回给客户,如箭头2所示

实现模块

预加载模块

在确定了技术方案后,预加载模块还有很多工作要做。列表网络数据分析完成后,将触发视频预加载。首先根据网址生成md5值,然后检查md5值对应的任务是否存在。如果存在,则不会重复提交。生成任务后,它将被提交到线程池,以便在后台线程中进行处理。当网络从无线网络切换到3g时,任务将被取消,以防止消耗用户的数据流量。

在进程池中执行预加载任务时,其过程如下:首先,它将获取本地代理的web地址,然后启动一个HTP请求。代理将接收处理的HTP请求,并开始实际数据预加载。预加载模块在读取指定数量的数据后终止。此时,预加载的任务已完成。流程图如下:

当用户快速滑动时,如何确保视频在几秒钟内继续打开?预加载模块将为每个任务维护一个状态机。抛出时,它将暂停交叉的任务,提高要显示的最新任务的优先级,并让它先执行。

代理模块

代理中的htp sr v er负责拦截播放器和预加载模块的htp请求。客户在请求时会带上cdn的网址,在没有本地缓存数据时会去cdn获取新数据。因为有多个地方可以向代理请求数据,所以有必要使用线程池来处理多个客户的连接,这样多个客户就可以并行,而不会因为请求前面有客户而被阻止。文件缓存使用l r u d i s k c h e。当超过指定的文件大小时,旧的缓存文件将被删除,这在使用文件缓存时很容易被忽略。由于我们的场景视频是连续播放的,没有搜索,因此文件缓存相对简单,不考虑文件分割。代理中的相同网址将映射到客户。如果同时进行预加载和回放,数据将只有一个副本,并且不会重复下载数据。代理的另一个内部结构图:

遇到的问题

在测试中,我们发现一些视频仍然播放得非常慢。如果仔细检查,预期的数据大小确实在本地缓存,但在播放时仍有很长的等待时间。这种视频有一个特点:木箱在最后。最后的木夫视频只有在下载完整个文件后才能播放。原因是木箱中有很多关键信息,这在之前的MP4格式分析中提到过。这个问题有两种解决方案:

解决方案1:

在转码时,服务器确保穆夫的头在前面。如果发现穆夫的位置不正确,视频服务器会纠正它。

postscript:要查看mufu在文件中的位置,可以使用十六进制文本编辑器打开它,并按字符搜索mufu的位置。你也可以在雨衣上使用m e d i a p r s e r。此外,可以使用fmpeg命令在头部或尾部生成mufu的mp4文件。

解决方案二

不是修改木箱的位置,而是在播放端进行处理。回放端需要检测流信息。如果穆夫面前没有文件,他会要求提供文件的尾部信息。具体来说:启动HTPM4请求并读取响应正文的开头。如果在开头找到了muff,则读取md a t。如果发现没有开始,首先读取md a t并立即重置连接,然后通过范围头读取文件末尾的数据,因为之前的htp请求已经获得了mp4文件的内容长度和整个大小,所以也可以通过范围头读取部分文件尾数据。示意图如下

这种方案的缺点是,木箱末端的视频将连接两次

后记

介绍了常用的视频编码格式和视频打包格式,并介绍了mufu头信息对视频播放的影响。通过对回放过程的分析,我们找到了问题的切入点。简单地说,它专注于数据预加载,提前完成向网络请求数据的工作,播放时直接从缓存中读取数据,然后从缓存中读取后续视频,不仅解决了视频初始化播放慢的问题,还解决了播放缓冲区的问题,这可以说是一举两得。代理是该方案的核心思想。本地服务器的网站是一个关键链接。视频预加载模块和播放器模块完全解耦,更换播放器后仍然可以使用播放器。到目前为止,视频馈送优化已经完成。根据在线数据,视频打开速度约为800毫秒。

回顾过去,也许我们可以进一步验证通过预加载接收到的数据,以确保缓存的是准确的信息,而不是固定的值。还可以进行更深入的优化,使用户观看视频的体验更加顺畅。

参考

颤振路由管理代码这么长,阿里工程师如何有效地解决它?(实用)1一个很好的方案,可以帮助您实现复杂数据源中单元格信息的精确规范化。关于颤振初始化过程,我必须告诉你们的是,在颤振中嵌入发源地组件的正确姿势是什么?没有供应的闲置鱼类的做法是什么?如何做到?游手好闲的鱼没有货源。闲置市场规模超过万亿。二手电子商务迎来了循环经济的红利。“校园圈”真的能成为游鱼生长的第二个引擎吗?

复制成功

微信号: ccjun91
添加微信群,试用软件

我知道了
添加微信

微信号: ccjun91
添加微信群,试用软件

一键复制加过了
18749471747
微信号:ccjun91添加微信
ccjun91