在 iOS 和 macOS Safari 上播放视频时遇到问题

大家好,

我们注意到在 3.6.0.beta3-latest 版本上,iPhone 和 macOS 上的 Safari 用户在尝试播放上传的 .mp4 (H.264) 视频时会出现无限旋转的加载图标。这些视频在最近之前都可以正常播放(我不确定 Discourse 的哪个版本是它们还能正常工作的最后一个版本)。

看起来 Safari 会发出一个 GET 请求来获取视频的起始字节(Range: bytes=0-1)(例如 /uploads/default/original/1X/44395933ccadf546b1b1ce65b742e24f900b33fa.mp4),该请求返回 200,但由于某些原因失败了,这些原因并未在 JS 控制台或网络检查器中显示(仅以红色高亮显示,没有错误消息)。如果直接将相同的 URL 粘贴到浏览器中,用户可以成功下载完整视频并播放。

macOS 上的 Firefox 和 Chrome 播放视频没有问题。Android 上的浏览器似乎也没有遇到问题。

视频文件很小(在 10MB 左右)。我们没有使用 S3 进行上传。

其他人能否证实或确认他们在使用 iPhone/Safari 播放视频时没有遇到问题?我还能进行哪些其他诊断来查明问题所在?

1 个赞

我在论坛上也遇到了类似的问题,但在这里测试相同的文件似乎可以正常工作。只有 iOS/Safari 用户受到影响。WEBM 容器中的一些视频可以正常播放,但大多数 mp4、mov 等格式的视频则不行。

2 个赞

您好,我最近也遇到了一些问题,并在 @tsk 发起的帖子中发表了评论,但该帖子已被删除。我原以为问题出在 mp4/av1 编码的视频上,因为我们的论坛上 webm/vp9 视频可以播放,但现在看来,对于 Safari 用户来说,问题似乎不止于此。

为了好玩,我已确认我使用的是最新版本,尽管我在提交记录中没有看到任何迹象表明它会影响 Apple 用户。

image

我的配置正在使用本地存储进行上传。大多数主题都受信任级别限制,但我们在这里的公共类别中进行测试:

您能分享该视频的链接,或在此处上传吗?

1 个赞

@Les79 我已将此视频上传到两个论坛作为测试。

您能否确认 pixelspace safari 播放线程视频对您不起作用,但这里的视频可以?

1 个赞

是的,此处发布的视频在我的 iPhone 13 和 MacBook Pro M3 的 Safari 浏览器上均可正常播放。它在 PixelSpace 论坛上无法正常播放。

2 个赞

此视频是 H.264 格式的 MP4 文件,应该可以在所有运行 Discourse 的浏览器上播放。鉴于它在这里可以运行,但在您的实例上不行,我怀疑是您的实例配置有误。

您是否在 Discourse 之上运行了额外的反向代理?我注意到此实例上的一些标头在标准安装中不存在,因此我想了解您做了哪些配置。

1 个赞

我也看到了同样的情况。

我确实将此容器用作反向代理

我曾考虑这可能是部分原因,但配置并未更改,据我所知,这是 3.6.0-beta2 的一个新问题。在重建后,我开始收到苹果用户的投诉。与 @mandyk 类似,我不记得我们之前使用的是什么版本。

image

Discourse 中是否有我应该评估的特定设置?

1 个赞

不是 Discourse 的问题,而是代理服务器的问题。

不幸的是,当人们在 Discourse 之上添加其他东西时,我们无法实际覆盖所有无限的可能性配置,这就是为什么我们提供带有反向代理配置的 Discourse 标准安装包。

可能缺少一个 Nginx 配置段,但您需要对此进行研究。

1 个赞

另外,我确认此线程中发布的视频在 Safari 中播放正常。

不确定这是否相关,但我发现的一个区别是此线程中的视频是从 S3 提供的。当 Safari 发出第一个 range 请求时,S3 返回 HTTP 206,这似乎是正确的。Pixelspace 实例和我的实例都使用 S3,而且看起来 Discourse 返回的是 HTTP 200(因为请求包含 Range: bytes=0-1 标头,这似乎不正确)。

我将相同的视频上传到了我的测试实例:

https://discourse-on-a-pi5.falco.dev/t/test-safari-bug/25?u=falco

已确认 discourse-on-a-pi5.falco.dev 上的视频在我使用的 Safari 浏览器上无法正常工作。同样,我可以看到视频请求返回的是 200 而不是 206。

编辑:此外,似乎响应试图返回整个视频,即使指定了 Range: bytes=0-1。我怀疑范围请求被忽略了,而 Safari 对此很敏感。

进一步编辑:这可能意味着除了 Safari 之外,其他浏览器在处理大型视频时的高效跳转功能也已损坏,因为它们需要在下载完整个视频后才能跳转。

3 个赞

在 Safari 中无法播放

而在 Test Safari Bug - Discourse 上可以正常工作,对吗?

是的,那个可以了!我在这里也看到了 HTTP 206。

1 个赞

看起来是我们的默认nginx配置出现了回归,感谢你的报告@mandyk

1 个赞

感谢 @Adubs 发布了用于比较的反驳!也感谢 Discourse 团队提供了一个出色的工具。

5 个赞

所以,为了增加一点乐趣,我将我的 app.yml 复制到了 app2.yml,更改了 url 和几个目录,现在我们有了运行稳定分支的 testfor.pixelspace.xyz。

https://testfor.pixelspace.xyz/t/safari-playback-test/8

我的用户在此处通过同一个代理确认它有效。

编辑:我现在看到问题得到了确认。抱歉没有早点想到尝试这个。感谢您的见解 @mandyk

我一个人是无法自己解决这个问题的。

3 个赞