我在 Safari 中遇到一个奇怪的错误,当我通过 PHP 提供 MP4 视频(使用基于令牌的身份验证系统混淆文档根目录下的文件)时,Safari 出于某种原因会触发 onerror 事件,<video>\'s并且视频永远不会加载(我无法从发送到 onerror \xe2\x80\x94 的事件对象中获取任何有用的信息,一切都未定义)。
当我直接访问 PHP 脚本时(即视频未嵌入页面中),视频控件会短暂出现,然后闪烁为 QuickTime 问号。
\n\n当我直接访问 MP4 文件时,它按预期工作。
\n\n奇怪的是,嵌入的视频在最新版本的 Mac 版 Chrome 中完美运行。
\n\n以下是通过 PHP 访问时的标头:
\n\nConnection:Keep-Alive\nContent-Disposition:inline; filename="test.mp4"\nContent-Length:5558749\nContent-Type:video/mp4\nDate:Tue, 22 Jun 2010 01:24:25 GMT\nKeep-Alive:timeout=10, max=29\nServer:Apache/2.2.15 (CentOS) mod_ssl/2.2.15 0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635\nX-Powered-By:PHP/5.2.13\nRun Code Online (Sandbox Code Playgroud)\n\n以下是直接访问 test.mp4 时的标头:
\n\nAccept-Ranges:bytes\nConnection:Keep-Alive\nContent-Length:5558749\nContent-Type:video/mp4\nDate:Tue, 22 Jun 2010 01:26:45 GMT\nEtag:"1c04757-54d1dd-489944c5a6400"\nKeep-Alive:timeout=10, max=30\nLast-Modified:Tue, 22 Jun 2010 01:25:36 GMT\nServer:Apache/2.2.15 (CentOS) mod_ssl/2.2.15 0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635\nRun Code Online (Sandbox Code Playgroud)\n\n唯一不同的标头是:Accept-Ranges(我认为没有必要)、Etag、Last-Modified、Content-Disposition 和 X-Powered-By。
\n\nChrome 不仅可以很好地处理 PHP 提供的视频,而且当我使用相同的脚本通过 Flash 播放器加载 MP4 时,它也可以正常工作。我就是不明白 Safari 到底是被什么卡住了。
\n\n编辑:另外,当我将内容配置更改为“附件”时,Safari 将很好地下载 MP4 文件。
\n为了让遇到这个问题的人感兴趣,以下是解释:
\n\n我问了一个我认为与另一个 Safari-specifc HTML5 video Problem 无关的问题:Single PHP \xe2\x80\x9cexit;\xe2\x80\x9d statements Prevent HTML5 video in Safari。
\n\n最终问题与 PHP 语句无关exit。事实上,问题在于我使用变量$_SESSION来验证请求,而 Safari 使用单独的进程来处理无法访问相同$_SESSION数据的视频播放(与 Chrome 不同)。
令人困惑的是,原来的 Safari 进程和播放进程都分别请求视频文件。我只查看了原始请求,它确实通过了$_SESSION基于身份验证,因此我认为这不是问题的一部分。
无论如何,如果您使用数据来验证Safari 中$_SESSIONHTML5 播放器的请求,请查看解决方案。<video>