361 words
2 minutes
记录一次PiliPlus PR贡献
2026-09-10
PiliPlus
PiliPlus

问题原因#

部分特定视频,如:BV1bW411P7k9 可以发现上述视频有1080P 60帧画质,但是实际无法播放。
对源码进行分析,发现播放器请求未强制指定 qn,会静默回退到 80。因此无法获取高画质1080P 60帧画质。
播放接口返回的 support_formats 只是服务端声明的画质列表,真正可播放的画质应以 dash.video 中的实际流为准。
部分视频会根据请求的 qn 分批返回视频流。例如 BV1bW411P7k9:

  • 请求高画质时,support_formats 包含 116/80/64/32/16,但 dash.video 仅返回 116。
  • 请求 80 时,dash.video 才返回 80/64/32/16。

修复内容#

  • 将 VideoHttp.videoUrl 的 qn 改为必传参数,避免隐式回退。
  • 首次请求显式请求高画质流。
  • 使用 dash.video 中的实际画质 ID 判断画质是否可用。
  • 当高画质响应缺少低画质流时:
    • 仅额外请求一次缺失画质;
    • 合并并去重两个响应中的视频流。
  • 播放和下载均只从实际存在的 DASH 流中选择画质。
  • 对空视频流增加保护,避免后续 first 等操作抛出异常。
  • 使用 try/finally 确保请求结束后恢复 isQuerying 状态。
  • 修正播放器内及详情页画质菜单的可用状态判断。

总结#

这或许是b站陈年代码所遗留的屎山,具体是什么原因导致的就无从得知了。

Link: PR #2828

记录一次PiliPlus PR贡献
https://arisaka.eth.limo/posts/piliplus/
Author
Mashiro Arisaka
Published at
2026-09-10
License
CC BY-NC-SA 4.0
Provenance
ENS Contenthash
Resolving…
Article File TX
Resolving…
Content Digest
Resolving…
Source Version
Resolving…
Comments