为提升用户观看体验,LinkedIn视频团队一直努力完善其视频自动播放功能。本文概述了LinkedIn自动播放产品标准,以及为实现此标准所开发的技术与架构。
文/ Evan Farina
译/ 元宝
审校/ John
原文
https://engineering.linkedin.com/blog/2019/03/feature-highlight--scaling-autoplay-videos-for-hundreds-of-milli
我们的视频团队始终致力于提升用户观看视频体验。在2016年底,LinkedIn的视频功能还处于雏形阶段,包括自动播放在内的一系列功能仍未成为现实。两年过去了,虽然自动播放已经成为LinkedIn实现良好视频播放体验的一个不可或缺的部分,但由于复杂的产品需求与遗留的性能问题,这一功能仍待我们去完善。本文将概述我们的自动播放产品标准和工程师为支持这一标准所开发的技术与架构,还有我们在构建这个可承载数亿规模用户的自动播放解决方案时遇到的一系列性能挑战。
技术用词
这篇文章将引用下列前端技术,关键词及定义如下:
产品标准
从工程和产品角度来看,自动播放是我们视频团队所构建的最复杂的功能之一,自动播放的关键在于细节上确保万无一失。为实现这一点我们着重关注了以下几个关键标准:
架构概述
LinkedIn的自动播放架构有以下四个关键部分组成:
用户体验方面的考虑因素
自动播放是一项复杂的功能,开发者需对其有十分透彻的了解。从用户角度出发,实现出色的自动播放交互体验需要考虑很多因素,以下是我们在构建此功能时考虑到的几个可直接影响用户体验的关键因素。
关注情景
LinkedIn.com上的大量视频都基于其特定情景而存在——播放视频的情景可能是Feed流、私人消息甚至学习播放列表......我们需要分析每种情景分别有哪些关键因素影响用户播放体验,而每个人对于网页上元素的认知与交互策略都是不同的。当视频处于Feed流情景时,如何同时管理一系列视频成为亟待我们解决的关键挑战;而当视频被用于学习情景时,一些用户既希望视频自动播放时保持静音,也希望在与视频发生互动时取消静音。对此我们制定了以下策略从而妥善解决该问题:在LinkedIn的学习应用程序中,播放列表加载视频,下一个连续播放的视频需要参考上一个播放视频的音量参数。深入研究用户与视频进行交互时所处的各种情景,并为每种情景量身定制自动播放解决方案是实现良好播放体验至关重要的条件。
播放窗口
在桌面端的LinkedIn 视频Feed流情景下,视频会在用户浏览至播放窗口时迅速播放并在滑出播放窗口时暂停。如果视频处于有声播放的状态则不适用于此项策略:当视频处于有声播放时,只有当用户对视频内容表现出足够的兴趣并希望在滚动视频Feed流时继续播放此视频,我们才会允许其在后台继续播放。
人性化设置调整
鉴于自动播放可能对某些用户的使用体验带来负面影响,允许用户关闭自动播放功能是至关重要的,在LinkedIn上我们为会员开放了禁用自动播放功能的权限。
网站性能
视频的背后是海量的数据,数据下载的性能直接关系到视频播放的效果。考虑到网络的带宽限制与桌面端浏览器的各种限制,调用过多资源优化视频下载性能可能会导致网页上其他资源的加载性能迅速下降。因此,我们必须将优化网站整体性能摆在优化自动播放策略之前,接下来我们将深入探讨此话题。
性能方面的考虑因素
我们的视频团队不断调整视频加载活动优化算法的介入积极性。一方面,我们希望优先下载视频内容以减少会员在等待视频缓冲上浪费的时间;另一方面,鉴于视频资源背后庞大的数据量,我们需要确保从服务器请求视频资源的过程不会为用户的网络带来过多负担;同时,随着单一网页上的视频数量的增加,大量视频资源与其背后的海量数据会明显加重网络带宽的压力;我们不仅需要考虑客户一端向服务器请求的总数据量,更应考虑数据下载的时间范围,同时掌握浏览器对高并发网络数据请求的限制。
接下来我们将进一步探究上述内容。
网络带宽
网络带宽资源优劣取决于以下几个因素:
总结优化策略:
移动数据流量计划
尽管许多用户会选择使用他们的移动数据流量来浏览LinkedIn,我们也要清晰意识到加载视频会快速消耗大量移动数据流量的事实。因此,默认情况下,只有在移动设备连接至无线网络时客户端才会开启自动播放;除此之外,处于移动网络环境下客户端只有在用户主动滑动页面至下一个视频时才开始加载数据。
滚动性能
如果网站包含诸如RSS订阅源这样需要用户滚动浏览的长页面,网页的滚动性能便是影响用户浏览视频内容的关键因素。鉴于滚动事件的触发与响应速度非常快,了解在滚动事件处理程序中,执行DOM操作对整个页面加载性能的影响至关重要。浏览器会在两个周期内完成大部分网页渲染工作:回流和重绘。正如Google在本文中所提到的那样,回流计算页面的布局会在更改CSS样式与移动DOM节点并发生滚动事件的情况下发生改变。另一方面,当网页样式的改变影响到DOM节点的视觉外观,同时节点的布局与屏幕上元素的位置不发生改变时,浏览器会进行重绘操作。浏览器的目标是限制回流与重绘的次数,使用原生RequestAnimationFrame方法可确保多个回流和重绘的批量循环处理。
考虑到上述情况,让我们来看看滚动页面会对页面的渲染性能产生怎样的负面影响。当用户滚动浏览器页面时,浏览器被迫重新计算随着页面滚动带来的DOM节点的移动与布局改变;如果在滚动事件的处理程序中改变DOM节点,那么浏览器将再次被迫重新绘制页面,这会导致滚动事件处理程序执行DOM操作的成本显著提高,同时导致视觉衰减(也被称为布局抖动)情况的发生。
为避免浏览器承受过大运算压力,请务必去除滚动事件并确保只有当页面停止滚动时才会进行回流而非每次滚动页面时进行回流。
视频加载策略
当我们制定视频加载策略时,如果您希望确保所有用户在您的网站上都拥有最佳的用户体验,那么重点关注前文所介绍的诸多影响性能的因素至关重要。接下来我们将就LinkedIn对一些功能的测试深入探讨每项实验功能的优劣。每一个精心设计的实验都将视频加载时间与网站整体性能作为关注重点。
快速加载DOM中的所有视频
积极地加载LinkedIn Feed中的视频
在LinkedIn中,我们已经尝试了积极与消极的视频加载策略。积极的视频加载策略是指进入DOM后立即开始下载视频;与其不同的是,消极的视频加载策略是指在视频进入播放窗口之前不会加载视频。在积极的视频加载策略中,视频基本上会在后台进行加载。
积极策略的好处是视频将在后台完成大部分或全部缓冲工作。后台加载的内容越多,视频进入播放窗口后需要加载的内容就越少。因此,与没有采取积极策略加载的视频相比,预先加载的视频在播放窗口中的缓冲时间更少。
但在连接速度相对较慢的情况下,积极加载视频的缺点最为明显。当我们在后台下载视频资源时,允许播放窗口下载视频数据的可用带宽较少;除了带宽问题之外,移动设备和桌面设备上的浏览器能够并行处理的HTTP请求数量十分有限。视频加载占用大量后台资源,可能会导致播放窗口中的内容加载出现延迟。
最重要的是,在上图中,一旦视频元素附加到DOM,无论视频元素是否已经进入播放窗口,网页都会加载所有三个视频。
有限队列加载
使用有限队列在LinkedIn Feed中加载视频
有限队列加载系统通过限制可以快速加载的视频数量,解决了无限制快速加载(高带宽和HTTP请求使用)和无限制队列系统(高HTTP请求使用)的缺陷。
虽然有限队列系统继承了无限队列加载系统的部分优势,但由于系统限制了后台可加载视频数量,其优势并不如无限队列加载系统般明显。
有限队列系统的缺点在于限制了后台加载视频的数量,如果会员处于高质量网络带宽,同时网页包含比队列所允许的最大加载数量还要多的视频,此项缺点尤其明显。
无限队列加载
使用无限队列在LinkedIn Feed中加载视频
队列系统旨在允许开发者与用户从快速加载的优势中获益,同时我们还需考虑其缺点。队列系统的工作原理是将页面上的所有视频添加到队列中,无论其是否在视频窗口中,浏览器按照添加顺序加载队列中的每个视频。虽然队列可同时存在多个视频,但系统每次只允许加载一个视频从而确保视频加载庞大的数据量不会阻塞浏览器可用的HTTP连接。
队列加载系统的一项优势在于可以快速地加载播放窗口外部的视频(如,在后台),允许视频在进入播放窗口时几乎不发生缓冲。
当然,无限加载队列的一个潜在缺点是在某些情况下,如果会员的订阅源包含大量视频的更新活动,网页可能会要求浏览器在很短的时间内下载大量数据。对于网络连接较弱的会员,这可能会导致观看体验不佳并对页面加载时间产生负面影响。
最重要的是,在上图中,这三个视频都有机会快速加载;然而视频不会被并行加载而首屏内容会被优先加载。我们发现,无限加载队列为我们的会员实现了用户体验和性能的最佳平衡。
结论
尽管LinkedIn构建的自动播放功能看似十分复杂,实际上是基于网络带宽、浏览器渲染周期、网站交互设备等环环相扣实现的结果。这直接关系着我们的会员浏览视频时的用户体验,如果使用得当,自动播放功能可以极大提升网站访问者的参与度。因为二十一世纪的网络用户渴望海量内容高效呈现在眼前,而视频便是实现这种效果的绝佳媒介。通过视频向我们的成员提供大量的高质量内容,需要一个这样的整体性能解决方案提供技术支持,我们期待此功能可为用户带来高质量视频播放交互体验的同时为企业带来收益与积极影响。
本文分享自 LiveVideoStack 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!