0
Fork 0
mirror of https://github.com/Silent1566/webhtv.git synced 2026-10-18 07:09:16 +00:00

修复:MPV 播放先出声后出画面

上游合并 45a72e2d97 引入的「输出快门」在本仓库是纯等待:
PlaybackActivity.syncShutter() 会在自动输出决策完成前把视频
SurfaceView 的 alpha 置 0,音频不受影响,于是声画分离。

但本地 SURFACE_AUTO_STABILITY_GUARD_ENABLED 硬编码为 true,
使 isAutoSurfaceDirectEnabled() 恒为 false、自动模式恒走 GPU,
永不存在需要遮挡的「直出探测帧」;零拷贝黑名单设备同理,
resolveSurfaceDirect() 对其在所有模式下都拒绝直出。快门因此
只是白等一个结论早已注定的决策。模拟器实测 start-file 到
playback-restart 相隔 4.34s,其间音频在 37.834 就绪、画面要
等到 38.813;探测另有 attempts=20 跑满 5s 的空转。

三处改动:
- shouldKeepVideoShutterClosed() 增加 isAutoSurfaceDirectEnabled()
  判据,无法抵达直出时不再关快门;guard 放开后自动恢复遮挡。
- prepareMpvOutputForNewItem() 改用同一判据。syncShutter 里
  keepClosed 是 nativeOutputPending || 谓词 的或关系,只改谓词
  会被 pending 旁路。
- 探测耗尽时释放快门。新增 mpvAutoOutputProbeGaveUp 让谓词与
  pending 两侧同时释放——只调 onPlayerOutputReady() 仅清 pending,
  谓词仍为 true,快门实际不会打开(首轮评审发现)。刻意不置
  mpvAutoOutputEvaluated,否则会永久停掉本片后续自动决策。

未修复的既有问题(不属本次回归,另行处理):硬解失败后 mpv 报
vid=no,而探测判据要求轨道就绪,导致 tracksEmpty=true 必然跑满
20 次。

验证:leanback / mobile 两变体编译通过;全量单元测试
3483(mobile) / 2725(leanback) 例中仅 MpvPreloadControllerTest
2 例失败,该失败在剥离本次改动的同一基线上同样存在,源自 08-19
上游 d41abf83c5 未同步断言,非本次引入。新增的 5 条源码断言逐条
注入回归实测有效(含 latch 与回调的顺序约束)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Silent1566 2026-08-23 01:50:46 +08:00
commit 6a458ec11c
2 changed files with 123 additions and 4 deletions