Safari 9.0 无法在存储服务器上播放 mp4 视频

Posted

技术标签:

【中文标题】Safari 9.0 无法在存储服务器上播放 mp4 视频【英文标题】:Safari 9.0 can not play mp4 video on the storage server 【发布时间】:2016-01-04 22:20:27 【问题描述】:

以下视频链接无法使用 safari 9.0(最新版本)播放。但旧版本的 safari、chrome 和 firefox 都可以玩。

http://assets00.grou.ps/0F2E3C/wysiwyg_files/Videos/saksuka/20150928104628-lhmkkfbhnkiisbhht.mp4

当我将视频从服务器下载到我的计算机时,我可以玩 safari 9.0。

这就是为什么我不认为这个问题源于视频编码。

我已经完成了这些设置;

mime.types
video/mp4   mp4 m4v
video/ogg   ogv
video/webm  webm

httpd.conf
AddType video/mp4 mp4 m4v
AddType video/ogg ogv
AddType video/webm webm

.htaccess
AddType video/mp4 mp4 m4v
AddType video/ogg ogv
AddType video/webm webm

【问题讨论】:

我在通过 S3 和 Cloudflare 提供小视频时遇到了同样的问题。在使用流式标头响应的服务器上工作正常,因此问题不在于视频编码。 向视频添加 CORS 标头 【参考方案1】:

更新 2 - 2020 年 6 月

此问题最常见的根本原因似乎是服务器未配置为正确处理范围请求。

Safari 期望在发送具有字节范围的请求时看到“206”响应。如果服务器以“200”请求响应,则 Safari 似乎无法处理此问题。其他一些浏览器似乎对此没问题 - 例如 Chrome。

下面的检查网络选项卡屏幕截图显示了成功的视频播放,其中包含范围请求和 206“部分内容”响应:

虽然下面的示例显示了一个无法在 Safari 中播放但在 Chrome 中播放的视频 - 可以看出服务器只是响应 200 请求:

您可以使用 CURL 命令测试服务器是否正确接受范围请求 - 在此处查看来自苹果的信息:

如果您不确定您的媒体服务器是否支持字节范围请求,您可以在 OS X 中打开终端应用程序并使用 curl 命令行工具从服务器上的文件中下载一小段:

curl --range 0-99 http://example.com/test.mov -o /dev/null

如果工具报告它下载了 100 个字节,则媒体服务器正确处理了字节范围请求。如果它下载整个文件,您可能需要更新媒体服务器。有关 curl 的更多信息,请参阅 OS X 手册页。

(来自: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 文件反复出现的问题。

我在 localhost node.js 静态服务器上测试了您的视频,它在 Safari 中播放良好,这意味着视频本身应该没问题。

如果您查看 Safari 中的 Web 检查器,您会发现 Web 请求不包含某些标头。这会导致一些服务器出现问题,并且它们不会按照 Safari 的预期方式响应,或者根本不响应。

您可以看到正在讨论的类似问题(我认为第二个问题不是您的情况,但说明发送到服务器的请求中包含的信息可能导致服务器“决定”不按您的意愿响应):

Failed to Load Resource, Plugin Handled Load on ios "Plugin handled load" dialog appears when playing a video within a web page within UIWebView

更新 1

使用wireshark捕获来自Chrome的请求,可以看出导致服务器响应带有要播放的视频,而来自Safari(在同一台机器上)的请求导致服务器没有响应。

请求通常相似,并且都包含引荐来源标头。 Safari 浏览器最初只要求从服务器返回前 2 个字节 - 它通过使用 'range' 标头来执行此操作,该标头用于指定文件返回的字节范围:

范围:字节=0-1\r\n

另一方面,Chrome 请求其范围请求中的整个视频:

范围:字节=0-\r\n

但是,在 Chrome 上使用 HTTP 工具(例如 Postman)并将范围更改为 0-1 似乎不会停止服务器在 Chrome 案例中的响应。事实上,使用该工具设置,尽可能与 Safari 设置的所有相同标题似乎仍然可以返回视频。

【讨论】:

你能澄清一下解决方案是什么吗?似乎这个答案并没有提供解决方案,而只是将我们指向其他 SO 问题。 @rinogo 这是一个中肯的评论——答案有点像调查日志,我不得不承认。原始视频链接不起作用,所以我现在无法再次测试,但是如果您有一个不起作用的示例,请发送它,并且我想查看最新的 Safari 版本。文件服务器可能正在识别浏览器类型并基于此更改其响应,但很难确定,可以肯定的是视频在本地播放良好并且服务器对发出请求的不同浏览器的响应不同. 这对我来说非常有用。当服务器无法响应范围请求时,我永远不会猜到 Safari 会失败。【参考方案2】:

问题是 safari 或 iOs 需要块。来自流媒体服务器的含义。如果您的视频来自 blob 或文件服务器,则 safari 将引发错误。你可以把它和这篇文章联系起来Failed to Load Resource, Plugin Handled Load on iOS

【讨论】:

【参考方案3】:

为了更清楚地了解未在视频标签中播放的 mp4,我想在这里分享我的经验。我花了很长时间解决最近阻止 mp4 在 Safari 中播放的问题。

正如前面一个答案中提到的,Safari 首先发送一个字节范围请求,要求一个视频标签,该标签需要 206 响应。但是,如果您使用 Service Worker,则响应返回 200,并且 Safari 似乎不知道如何处理这个问题。 我们的解决方案是排除使用 Safari 的 Service Worker。

我们通过在 MacBook 上使用 Safari 调试器的网络选项卡来解决我们在 iPad 上看到的问题时发现了这一点。附件是用于比较/参考的屏幕截图。左侧选项卡显示默认情况下调用的外观。右侧选项卡显示了使用 Service Worker 时您会看到的内容。

【讨论】:

你会扩展你的“服务工作者”评论吗?并非所有人都将使用与您相同的网络服务器。 是的,这里有更多信息:通过 Service Worker,我说的是 Web 浏览器的 Service Worker,而不是任何存在于 Web 服务器上的东西。我们的前端应用程序在浏览器中使用了此功能。如果检测到 Safari,我们已经添加了一些额外的代码以不使用 Service Worker。

以上是关于Safari 9.0 无法在存储服务器上播放 mp4 视频的主要内容,如果未能解决你的问题,请参考以下文章

视频无法在 iOS Safari 上播放 - iphone 6s

Safari html5 视频 mp4 未在 htaccess 文件夹中播放,[重复]

HTML5 视频背景无法在 iPhone 上播放 Safari

HTML5 视频无法在 Safari 中播放

Ionic 媒体插件无法在 iOS 上播放本地存储的 mp3 文件

mp4 在 safari 中不起作用