TL;DR 如果Chrome看bilibili有明显卡顿,请使用非Chrome(或Chromium内核的浏览器)观看B站 eg. Firefox

Identifying the problem

如果你使用Chrome看bilibili时出现以下状况,请继续阅读本文:

每缓存一小段视频之后,在这段视频没有播放完前,剩下的部分都不会继续缓存。直到这段视频播放完了,出现卡顿,才会开始加载下一段,由此导致一个5分钟的视频被切割成了20个15秒的视频,每15秒中间卡5秒,不能自理。

由于特征和一般网速慢导致的卡顿并没有明显区别,所以这个问题很容易被归咎于ISP,就不了了之了。然后某天半夜我闲着没事翻了一下bilibili的视频统计信息,发现连接速度曲线表现很奇怪,才发现这事其实是DASH的锅。

MPEG-DASH playback, Chrome and Firefox

首先,什么是DASH?

Dynamic Adaptive Streaming over HTTP (DASH), also known as MPEG-DASH, is an adaptive bitrate streaming technique. MPEG-DASH works by breaking the content into a sequence of small HTTP-based file segments, each segment containing a short interval of playback time of content that is potentially many hours in duration, such as a movie or the live broadcast of a sports event. (Adapted from Wikipedia)

通俗地说,DASH把一个视频切割成若干段数十秒的小片段,按需缓存。譬如说,你点开一个30分钟的视频,看了10秒就暂停,而没有关播放器。根据传统的视频缓存策略,即使你暂停了视频,剩下的20+分钟依然会被加载完,浪费了大量带宽。如果有MPEG-DASH playback system,播放器会根据你每时每刻所在视频的位置来制定缓存策略。如果你只看了10秒就暂停,那么DASH可以选择只缓存前30秒,直到你继续播放到20秒时,才会继续缓存30-60秒。这个系统听起来是不是非常高效节能?那么问题来了: 这个系统建立是在视频播放器的缓存算法完美工作的前提下的。并且,很不幸的是,由于我学校的ISP很狗,加上Chrome强制开启不工作的DASH,根本无法用Chrome流畅观看bilibili。

只要对比一下Bilibili HTML5 player在Chrome(强制DASH)和Firefox(无DASH)下的连接速度曲线和player log即可看出问题所在:

Chrome
▲ Google Chrome 61.0.3163.100 (Official Build) (64-bit) DASH Enforced
观察连接速度曲线,有两个突起显示出正在缓冲,其余都是无活动 (0 KB/s)。很显然是因为DASH把视频分段之后,算法没有掌握好seek下一段的正确时机。于是就出现了看15秒卡5秒的现象…..
Log中的seeking表示正在请求下一段视频缓冲,此时由于DASH的算法日狗,已经卡住了。当视频播放时间变长之后,可以观察到seeking->seeked循环。

Firefox
▲ Firefox 56.0.1 (64 bit) No MPEG-DASH
虽然略有波动,但是没有DASH时连接速度曲线整体平稳。速度稳定在 500 KB/S上下。视频缓冲直到缓冲结束前都没有停止。
从log可以看出initialization结束之后播放器只加载了一次缓冲。因为没有DASH,整个视频是作为一个整体来缓冲的,就不会导致卡顿问题。

结论: Firefox (up tp 56.0.1) 默认不使用DASH,是看b站的理想浏览器。

An attempt to disable DASH

U2B Help Forum上这个帖子提供了一个不使用扩展的解决方案。
在Chrome 44或45之前,chrome://flags/里可以找到下列选项
flag

将这些选项全部禁用后(关键在于Disable Media Source API),DASH就会被禁用。然而这个方法问题的是

  1. 需要旧版本的Chromium内核
  2. 由于U2B视频的很多格式(480P, 1080P or higher)在服务器端就是以DASH-MPEG缓存的,所以根本不可能禁用。

    YouTube have removed some of the qualities for the non-DASH formats. So if you have DASH Playback disabled it will remove 480p, 1080p and Original. The only qualities there are available are therefore 144p, 360p and 720p. (U2BCenter Issue #185)

单单为了b站而废了U2B,实在太麻烦了。结论: FF大法好


然而如果你的Firefox客户端依然有开启DASH的现象,可以到
about:config,找到media.mediasource.enabled,把它设为false。
media.mediasource.enabled

Using Unblock Youku with Firefox

Firefox没有Unblock Youku官方维护的extension,使得看番/版权视频有限制。
官方论坛提供了最简单的解决方法:
Options -> General -> Network Proxy -> Automatic proxy configuration URL: http://pac.uku.im/pac.pac
PAC
可以到 https://uku.im/check 检查是否生效
Check

Unless specifically stated, all the articles on this blog are under the license of Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) .