Safari 里 X 的视频或 GIF 黑屏
X(Twitter)上的视频或 GIF 只显示第一帧,或者是一个黑框。点播放后计时在走,画面却一直是黑的。同一条帖子在 Chrome 里播放正常。
一句话:用 Cmd+Q(⌘Q)完全退出 Safari,再重新打开。只关窗口不够。
症状
- x.com 上的 GIF 和视频只显示第一帧,或者是黑色、灰色的框。
- 点播放后计时在走,画面一直是黑的。
- 连视频的直接链接(video.twimg.com 上的 .mp4)也是黑的;发新帖时添加的视频,预览同样是黑的,而那个文件还只在你的 Mac 上。
- 同一条帖子在 Chrome 里播放正常。
解决方法(按顺序)
- 用 Cmd+Q 退出 Safari(或选择“Safari 浏览器”›“退出 Safari 浏览器”),然后重新打开。只关闭窗口的话,Safari 仍在运行。我们就是靠这一步解决的。
- 还是黑屏?重启 Mac。
- 还是黑屏?逐个关闭 Safari 扩展(“Safari 浏览器”›“设置”›“扩展”),每关一个就试一次视频。
为什么是 Safari,而不是 Chrome
Chrome 在自己的引擎里解码并绘制视频。Safari 则把视频交给一个单独的辅助进程 com.apple.WebKit.GPU,由它调用 macOS 自带的媒体系统。关闭 Safari 的窗口并不会停止这个进程。在我们遇到问题的那台 Mac 上,Safari 和这个进程已经运行了 16 个小时,进程卡住了,所有视频都是黑屏。退出 Safari 后,它会重新启动。
不是文件或网络的问题
- 视频数据一直在传输:计时在走。
- 存在 Mac 上、完全不经过网络的视频也是黑的。
- Chrome 和 Safari 解析视频服务器得到的是同一个地址。(如果你用的是 Cloudflare 或 Google 的 DNS,Chrome 可能会改用 DNS over HTTPS,但结果相同。)
可选:看看辅助进程运行了多久
在“活动监视器”里搜索“WebKit”。或者在“终端”中粘贴:
ps -axo etime,comm | grep WebKit.GPU
第一列是每个辅助进程已运行的时间(时:分:秒,超过一天时前面会加上天数)。其他应用也使用同一个辅助进程,所以可能会看到好几行。运行时间长只是线索,不是证据。
我们是在发布 Bytewell 演示时遇到这个问题的。Bytewell 本身是一款面向 Mac 开发者的磁盘清理工具。