为啥目前视频如此能“混”? 打开浏览器,点下一个视频,多半是那种长条形的播放器。屏幕上方那个圆环,有时候滚得好快,有时候彻底不动。

那都是为了让用户去适应,适应他们不想全看下去的习惯。

这玩意儿本质就是个 HTML 5,内核就是那个老大哥 WebKit 要么 Blink。

那会儿大家认定这玩意儿只能放 MP4,目前呢?这就好比那会儿的人只能去超市买瓶装水,目前居然能去便利店买桶装水,这不叫进化,这叫“混用”。 最近我发现自己有点困惑,有时候心里实际上想问的是:到底是哪位把视频加进了 HTML5?

要么说,是 HTML5 要把视频“吃”掉?实际上这两者哪个都没错。视频原本就是独立文件,它有自己的格式。而 HTML5 只是个容器,是个架子。就像那会儿没有建筑,砖头是独立的;后来有人搭起了脚手架,把砖头塞进去,这就叫“带积木的房子”;目前还有人把螺丝刷成油漆,把砖头混成纪念品,这也叫“带积木的房子”。

关键是,目前的浏览器,特别是 Chrome,对 HTML5 的兼容性已经忒顶了。你没看到那些“弱智”的动画效果,没看到那些为了测试兼容性而强行加在视频上的复杂特效吗?那是厂商故意给你留下的后门,让你认定这玩意儿真能如此好用,实际上内核早就搞定了一切。 目前的视频播放逻辑,实际上早就跑不出去了。

那会儿是“播放”一个文件,目前更像是“拉取”一个流。

视频,你实际上是在跟服务器讲一个活儿:我要这段视频,内容是啥?格式是啥?长度是多久?要是直接说“播放”,浏览器可能不知道该下载多少数据,直接害得卡顿。

故此目前的做法是,视频流直接塞进一个 Buffer,把它变成一段内存数据。

然后,用 HTML5 的 DOM 树去推它。

这段数据就是 DOM,而服务器负责把这段数据拆成一个个毫秒级的片段,一个一个地喂给浏览器。

这个过程叫“流式传输”。 你想想,要是视频不是这种“流”直接灌在浏览器里,那得多卡顿?特别是高清片,大得你连手机内存都得先掏出来。目前的做法是把视频切成粒小的块,也就是 Segments。每块大约一毫秒,浏览器只需求处理这一小块,瞬间就能加载。

然后,你让浏览器把这些小块拼成整个的视频,再还原到那个 DOM 节点上。

这就好比你点了一杯奶茶,你当作你要等整杯都热好才能喝,结局奶茶店直接给你打钱,你每一口都能喝到。浏览器就像那个打钱的人,它不需求等你喝完了再给钱,它每收到一个钱,你就喝一口,多快多快。 这种流式传输技术,在 HTML5 里体现得淋漓尽致。你会发现,目前的视频在加载的时候,进度条是动的。它不是那种静止不动的线,而是像过山车一样,上下波动。

这实际上就是那个叫做“自适应比特率”的东西在起功能。网站想让你秒开,它就给你大体积;你想看慢点,它就把数据包切碎了,你慢慢看。

这技术是 HTML5 给浏览器塞的“外挂”,它让视频管理从“瞬间搞定”变成了“动态调教”。 再看那个圆环填充,那也是 HTML5 的功劳。

那会儿那种圆环,那是为了掩盖进度条条子,目前呢?目前的圆环有动画,有颜色变化,有时候还跟视频的背景色跑起来。

这实际上是个“伪圆环”要么叫“虚拟圆环”,它实际上是个 DOM 元素,跟视频是独立存有的。当视频播放的时候,这个圆环会根据进度条的变化,把自己“撑”大,要么“瘪”下去。

这听起来挺复杂,实际上是个好办的覆盖关系。用 CSS 的 `position: absolute`,要么更好办的,直接用那个叫 `progress` 的属性来实现。

这玩意儿在 HTML5 里就是如此干出来的,它把视频播放器搞成了“父子”要么“兄弟”关系,互不干扰,但又亲密无间。 说到数据,目前的视频文件,甭管是 4K 还是 1080P,体积都大得离谱。一个 4K 的 HDR 视频,有时候四个 GB 都不一定够用,还得下载几个 GB 的缓存文件。浏览器如何跟如此多数据打交道?那会儿的做法是,你每次点视频都得去下载一次,要么下载一个几十 GB 的整个包,这速度忒慢了。目前的做法是,服务器先把视频切成几段,每段几百 KB,然后推送到你的浏览器里。浏览器自己只负责这几个小段。当你想刷到第 1001 秒的时候,浏览器只去下载第 1000 秒的那一小段,瞬间就有了。

这速度,确实有点让人质疑人生。 并且,目前的视频播放器还能在后台“偷看”。当你打开网页的时候,浏览器实际上已经在默默预备播放下一段视频了。它不需求你点任何东西,后台就已经把视频流预备好了。你只是点一下就启动。

这实际上是利用了 Web 的虚拟化特性。浏览器把你的页面当成一个庞大的工作区,里面的数据都是虚拟的。视频流也是虚拟的,它是从服务器那个虚拟的缓冲池里取出来的。

这种机制,让视频加载变得极快,也让你感觉不到它的存有。 再讲个具体的例子。你那会儿看电影,选个 800MB 的格式,下载完你自己刷新页面看。目前呢?你直接点那个入口,视频流就直接拉进浏览器。浏览器自己管理这个流,就连还能根据网速自动调整流的速度。

要是网速好,它就推高比特率,让你画面清;要是网速差,它就自动下降比特率,保证不卡。

这逻辑一看就是 HTML5 的功劳。它把“网络管理”这个活儿,交给了浏览器内核,而不是交给网站负责。 还有一个细节,是提示音。目前大量视频播放时,会有那个“叮”的一声。

这声音是如何来的?是网页直接喊出来的,还是视频文件里带进来的?实际上目前的做法是,网页把音频文件也塞进浏览器里,跟视频流一起流。浏览器自己合成声音,要么直接读取网页里的音频标签。

这听起来像是网页在玩文字游戏,但实际上没啥技术含量。

这就像你在听有声书,书页翻过了一页,书里自动加了一个声音。

这声音是虚拟的,跟那个实体书没关系。 最终,我们聊聊那个“弱智”的圆环。

为啥有的圆环做得像老式播放器,有的做得像个动态画图?实际上这取决于网站的策划。有的网站忒在意兼容性,故此圆环做得死板;有的网站忒想炫技,就把圆环搞成了复杂的 SVG 动画。但不管圆环做得多好,它本质上还是那个 `progress` 标签要么 CSS 的 `background` 属性。它只是一个容器,用来装进度条要么占位。视频是流,圆环是容器,它们之间的关系是“内容”和“包装”。 总的来说,目前的 HTML5 视频,已经不再是那种需求你去适应、去学习的工具。它更像是一个看不见的管道,数据从服务器经过管道,直接灌进浏览器,然后浏览器自己组装、自己播放、自己管理。它不需求你懂 DOM 树,也不需求你懂流式传输,你只需求点一下,它就能给你带来一场视听盛宴。

这大约就是现代互联网给用户的“降维打击”吧。视频不再是文件,视频不再是流,视频已经成为了一层新的、更粘稠的、更随机的 DOM 元素,是 HTML5 世界里最迷人的那几滴墨水。