页面载入就调用播放,控制台抛出一条红色异常,视频停在第一帧,用户以为资源加载坏了,刷新也没用。乍看像缓存或者权限的锅,追下去往往不是。

video.muted = true;
video.play().catch(() => { btn.hidden = false; });

追下去是这么回事:没有用户手势时带声音播放会被策略拒绝,调用返回的承诺被拒之后没人处理,异常直接冒到控制台,播放也就停下来了。

「play() 被拒绝」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,先把视频元素设置成静音 然后再调用播放方法;在失败的回调里降级成静音状态 然后再重试一次;两次都失败就显示一个明显的播放按钮给用户。

验收就看一点,控制台里不再出现未捕获异常,视频能播或者出现播放按钮。

作者 9823189