更新 2 - 2020 年 6 月
此问题最常见的根本原因似乎是服务器未配置为正确处理范围请求。
Safari 在发送带有字节范围的请求时预计会看到“206”响应。如果服务器响应“200”请求,则 Safari 似乎无法处理此问题。其他一些浏览器似乎可以接受这一点 - 例如 Chrome。
下面的检查网络选项卡屏幕截图显示了成功的视频播放,包含范围请求和 206“部分内容”响应:
虽然下面的示例显示了一个无法在 Safari 中播放但在 Chrome 中播放的视频 - 可以看出服务器只是响应 200 请求:
您可以使用 CURL 命令测试服务器是否正确接受范围请求 - 请参阅此处来自苹果的信息:
如果您不确定您的媒体服务器是否支持字节范围请求,您可以在 OS X 中打开终端应用程序并使用curl 命令行工具从服务器上的文件下载一小段:
卷曲——范围0-99http://example.com/test.mov http://example.com/test.mov-o /dev/空
如果该工具报告已下载 100 字节,则媒体服务器正确处理了字节范围请求。如果它下载整个文件,您可能需要更新媒体服务器。有关curl 的更多信息,请参阅OS X 手册页。
(from: https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/CreatingVideoforSafarioniPhone/CreatingVideoforSafarioniPhone.html#//apple_ref/doc/uid/TP40006514-SW6 https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/CreatingVideoforSafarioniPhone/CreatingVideoforSafarioniPhone.html#//apple_ref/doc/uid/TP40006514-SW6)
对于正确播放的第一个视频,使用上述参考中的 CURL 命令,我们可以看到响应是仅按预期返回请求的范围:
在上面的示例中使用相同的 CURL 命令,该命令不能在 Safari 中播放(但可以在 Chrome 中播放),表明服务器正在响应完整文件,而不仅仅是请求的范围:
此 CURL 测试可能是检查服务器是否正确尝试处理请求的最快方法。
原答案
这似乎是 Safari 上某些 mp4 文件反复出现的问题。
我在本地主机 Node.js 静态服务器上测试了您的视频,它在 Safari 中播放得很好,这意味着视频本身应该没问题。
如果您查看 Safari 中的 Web 检查器,您会发现 Web 请求不包含某些标头。这会导致一些服务器出现问题,并且它们不会按照 Safari 预期的方式响应,或者根本不响应。
您可以看到正在讨论的类似问题(我认为第二个问题不是您的情况,但说明发送到服务器的请求中包含的信息可能会导致服务器“决定”不按您想要的方式响应):
- 无法加载资源,插件在 iOS 上处理加载 https://stackoverflow.com/q/18103103/334402
- 在 UIWebView 内的网页中播放视频时出现“插件处理加载”对话框 https://stackoverflow.com/questions/9422507/plugin-handled-load-dialog-appears-when-playing-a-video-within-a-web-page-with
Update 1:
使用wireshark捕获来自Chrome的请求,可以看到服务器有响应并播放视频,而来自Safari(在同一台机器上)的请求则导致服务器没有响应。
这些请求通常相似,并且都包含引用标头。 Safari 浏览器最初只要求从服务器返回前 2 个字节 - 它通过使用“range”标头来实现这一点,该标头用于指定文件返回的字节范围:
另一方面,Chrome 在其范围请求中请求整个视频:
然而,在 Chrome 上使用 HTTP 工具(例如 Postman)并将范围更改为 0-1 似乎并没有阻止服务器在 Chrome 情况下响应。事实上,使用该工具尽可能设置与 Safari 设置相同的标题似乎仍然可以正常返回视频。