上周有用户发现 YouTube 似乎通过服务端限速来阻止用户使用广告拦截器,即开启广告拦截器后 YouTube 视频流拉取速度会严重下降甚至无法正常播放,此时 YouTube 会提醒用户遇到播放问题,点击后则提示使用广告拦截器可能会影响视频的正常播放。
但这种只是猜测没有明确的证据,不过开发者 @LOOPS 发布的分析则表明 YouTube 确实在测试假缓冲技术,该技术目前通过 A/B 测试投放给不同的用户来收集反馈数据,因此并非所有用户都会碰到这种假缓冲问题。
什么是假缓冲?
假缓冲是 YouTube 开发的特殊延迟机制,当用户使用广告拦截器时 (无论是扩展程序还是浏览器自带的屏蔽功能),视频会在开始播放时故意延迟加载。
这种缓冲时间并非视频本身的内容加载问题,而是 YouTube 通过技术手段模拟出来的延迟,值得注意的是假缓冲延迟仅出现在视频开头,且延迟时间约为原本广告时长的 80%。
例如广告时长是 15 秒,当广告被拦截后出现的延迟时间是 12 秒,如果有 6 秒和 15 秒的不可跳过广告组合,则延迟时间会达到 16.8 秒,本质上这是一种针对屏蔽广告用户的惩罚措施。
YouTube 怎么实现的假缓冲:
具体来说 YouTube 通过内部 API 和视频流服务 GVS 来实现假缓冲的,当用户点击视频时 YouTube 内部 API 会提供包含延迟指令的视频流链接,迫使播放器在加载内容时先等待一段时间。
有趣的是谷歌正在进行的 A/B 测试可以说惨无人道,因为无论你是否屏蔽广告,只要被纳入 A/B 测试组则都会碰到延迟的问题,只不过如果没有屏蔽广告则延迟时间极短并且几乎无法察觉,如果屏蔽广告则延迟时间会显著拉长影响体验。
这里还需要说明的是,网上有传言称 YouTube 会通过提高 CPU 使用率来损害电脑硬件,这种说法是完全错误的,假缓冲只是播放器指令,不需要额外使用 CPU 资源。
如何绕过假缓冲机制:
目前技术社区已经找到部分办法可以绕过假缓冲机制从而继续屏蔽广告而不需要等待,通过修改 YouTube 播放器参数中的特定参数可以避免广告的出现,从而直接消除假缓冲。
核心方法是设置 isInlinePlaybackNoAd
属性设置为 true
,该属性可以在 YouTube 内部 API (InnerTube API) 请求中找到,技术人员通过分析 YouTube 前端 js 代码和提取底层协议发现这项设置。
具体来说 uBlock Origin 等广告拦截器可以通过增加过滤规则,在客户端向服务器发送请求时动态修改 JSON 数据并添加 isInlinePlaybackNoAd: true
字段避免广告加载。
不过这个方法仅适用于热导航,也就是 YouTube 页面内点击跳转视频,如果从外部链接直接点击进入 YouTube 特定视频则无法消除假缓冲,因为初始播放数据由后端直接嵌入到页面,无法被客户端修改。
但 YouTube 也在进行反击:
YouTube 在测试中引入一种脚本锁通过将某些全局关键对象设置为不可写,来阻止广告拦截器通过代理修改请求数据,这一脚本通常被嵌入到 HTML 头部标签中,作为页面加载的首个元素执行。
对于 Firefox 浏览器来说这个问题可以通过 HTML 过滤器轻松搞定,但在基于 Chromium 浏览器中,由于扩展 API 的限制,这种方法不可行,所以技术社区正在探索其他方式。