2010-06-22 66 views
2

我在Safari中遇到了一个奇怪的错误,当我通过PHP为MP4视频提供服务时(使用基于令牌的方式对文档根目录下的文件进行模糊处理认证系统),Safari出于某种原因触发了<video>'s onerror事件,并且视频从未加载(我无法从发送给onerror的事件对象中获取任何有用的信息 - 所有内容都未定义)。无法在Safari/Mac上通过PHP提供HTML5视频(5.0)

当我直接访问PHP脚本(即,视频未嵌入页面中)时,视频控件会在瞬间出现,然后闪烁到QuickTime问号。

当我直接访问MP4文件时,它按预期工作。

奇怪的是,嵌入式视频在最新版本的Chrome for Mac中完美运行。

这里是头通过PHP访问时:

Connection:Keep-Alive 
Content-Disposition:inline; filename="test.mp4" 
Content-Length:5558749 
Content-Type:video/mp4 
Date:Tue, 22 Jun 2010 01:24:25 GMT 
Keep-Alive:timeout=10, max=29 
Server: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 
X-Powered-By:PHP/5.2.13 

这里是头时test.mp4直接访问:

Accept-Ranges:bytes 
Connection:Keep-Alive 
Content-Length:5558749 
Content-Type:video/mp4 
Date:Tue, 22 Jun 2010 01:26:45 GMT 
Etag:"1c04757-54d1dd-489944c5a6400" 
Keep-Alive:timeout=10, max=30 
Last-Modified:Tue, 22 Jun 2010 01:25:36 GMT 
Server: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 

唯一不同的标题是:接受-范围(我认为这是不必要的),Etag,Last-Modified,Content-Disposition和X-Powered-By。

Chrome不仅可以处理PHP提供的视频,而且当我使用相同的脚本通过Flash播放器加载MP4时,它也可以正常工作。我无法弄清楚Safari是如何窒息的。

编辑:此外,当我更改内容处置为“附件”时,Safari将下载MP4文件就好了。

回答

3

在谁碰到这个问题来的人的利益,这里的解释:

我问什么,我认为是关于另一个野生动物园specifc HTML5视频问题无关的问题:Single PHP “exit;” statement prevents HTML5 video in Safari

最终,这个问题与PHP exit声明无关。事实上,问题在于我使用$_SESSION变量来验证请求,Safari使用单独的进程来处理无法访问相同$_SESSION数据的视频回放(与Chrome不同)。

令人困惑的是,原始的Safari进程和播放进程分别请求了视频文件。我只看到原来的请求,它没有通过基于$_SESSION的认证,所以我认为它不是问题的一部分。

无论如何,如果您使用$_SESSION数据来验证Safari中的HTML5 <video>播放器的请求,check out the solution

+0

我发现这很好。谢谢。同样的问题似乎发生在当前版本的Firefox 27和Win 7上的IE 11上。在Chrome 32上工作时。 – Haprog 2014-02-19 14:51:22

+0

那么解决方案是什么? – Geo 2014-03-17 18:50:01

+0

@Geo我想我最终使用查询字符串来存储状态,因为你不能使用'$ _COOKIE' /'$ _SESSION'。 – JKS 2014-03-18 22:58:14

1

您是否尝试修改通过php发送的头文件以匹配直接文件发送的头文件,然后逐个删除它们/更改它们以查看它是您自己的文件?

+1

准确地说,我一直在做最后一个小时!与Etag混用,Accept-Ranges,Content-Disposition等等,不要运气!老实说,我无法分辨两者的区别。 – JKS 2010-06-22 02:30:02

1

正如我昨天发现的那样,iPhone版的Safari推迟播放mp4文件到集成在iPhone中的quicktime播放器。这个播放器首先获取mp4的前两个字节(以某种方式确定我想的关键帧)。它为此使用接受范围标题。然后再次使用接受范围请求整个文件。

我正在使用PHP的as well as这些mp4文件,并且我发现支持这个可接受范围的头文件突然间开始工作。它可能会解决您的桌面版Safari的问题,尽管这对我来说一直没有接受范围的支持。

成功。

鲍勃。

0

我在safari上遇到了类似的问题。我有一个PHP脚本,流mp4/webm/ogv到html5视频播放器。直到几个星期前,它在safari中工作正常。它继续在其他所有浏览器中运行,并且所有的请求/响应头信息对我来说都不错,尽管我一直在获取一个插件无法在safari中加载错误。我终于意识到,由于我已将我的虚拟主机更改为https并使用openssl为自己的证书签名,safari阻止了对媒体内容的GET请求。道德故事......如果您使用openssl并在本地开发,safari不会为您检索视频数据,如果它不信任您的ssl证书。