我最近发现,在我自托管的 Discourse 论坛上,多个视频在 iPhone 和 iPad 上无声地无法播放。经过调查,根本原因是这些视频使用了 VP9 编码,并封装在 MP4 容器中——这种组合 iOS Safari 无法播放。
问题成因
Facebook(以及其他平台可能也存在类似情况)在用户下载其内容时,有时会提供 VP9 编码的视频。当这些文件上传到 Discourse 时,系统会正常接受——.mp4 扩展名无法反映其内部使用的编码格式。在桌面浏览器和 Android 设备上,视频可以正常播放,因此问题不易被察觉。而在 iOS Safari 上,视频会显示缩略图和播放按钮,但点击后只会显示旋转加载指示器。用户通常会认为这是网络问题,从而不再进一步报告。
为何难以察觉
- 文件扩展名(
.mp4)与正常工作的 H.264 文件完全相同 - 桌面浏览器支持 VP9,管理员在桌面端测试时不会发现问题
- iOS 用户通常不会单独报告媒体播放失败,尤其是当同一帖子中的其他内容仍可正常查看和播放时
- 系统没有向管理员提供警告或错误提示
建议的解决方案
在视频上传时,Discourse 可以检查视频编码格式(Docker 容器中已内置 ffprobe),并选择以下任一方式处理:
- 拒绝上传,并显示明确提示,说明 VP9 在 iOS 上不受支持,要求用户重新编码为 H.264;或
- 自动转码 视频为 H.264(类似于某些平台对上传内容的标准化处理)
方案 1 实现复杂度较低,且已能带来显著改善。方案 2 则能为用户提供无缝体验,是更理想的选择。
环境信息
- 自托管 Discourse,运行于 Docker 中,使用本地存储(未使用 S3)
- Discourse 版本:2026.4.0-latest
- Discourse 前端部署了 Apache 反向代理,其后为 nginx
临时解决方案
对于遇到此问题的管理员,修复步骤如下:
- 使用
ffprobe识别 VP9 文件 - 使用
ffmpeg -c:v libx264 -profile:v main -level 3.1 -r 30 -movflags +faststart将视频重新编码为 H.264 - 更新
uploads表中的sha1、url和filesize字段 - 更新受影响帖子原始 Markdown 中的
upload://短链接令牌 - 重新生成受影响帖子的内容
这是一项相当繁琐的手动操作,大多数论坛管理员并不具备执行这些步骤的能力。