Explanation on Apple Web site
简短的回答:
因为iOS设备需要服务器支持字节范围的视频请求,并且您的代码不提供该功能。
龙答:
当iOS设备使一个视频的请求,他们并不下载整个视频。他们一次只下载一小块,以最小化带宽使用,并且还因为用户可能想要在不下载以前的部分的情况下跳到视频的后期部分。为此,他们提出字节范围请求。基本上,他们告诉服务器“嘿,给我的文件在第100和第200字节之间的部分”。字节范围请求使用Range
头,看起来就像下面
GET /myvideo.mp4 HTTP/1.1
Host: www.example.com
Range: bytes=500-999
的在这种情况下,答复必须服务器类似的东西
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Range: bytes 500-999/20000
所以,你需要比这四个PHP线更以支持iOS设备。首先,您将解析Range
标题。该信息可在$_SERVER['HTTP_RANGE']
全球变种中找到。然后,您只需要提取文件的这一部分并将其发送给客户端。您还需要填写Content-Range
标题。
请注意,Content-Range
标题包含完整的文件大小,因此您的代码需要提供该信息。还要注意几乎每个服务器都支持那种对静态文件的请求。如果您不需要对文件进行特殊处理,则可以选择将文件复制到公用服务器上,并让它为您完成这项工作。
非相关评论
把它看作是建设性的批评,但你目前的形式代码将带给你的服务器的膝盖。您基本上发送它之前整个文件在内存,并且更糟糕的是,您为每请求。如果100人同时下载100MB视频,则需要在服务器上为内存提供10 GB的服务。这并没有扩展,完全没有。
更好的解决方案是使用readfile函数将文件作为从CDN读取的文件发送出去。这样,你只需要使用一小块内存,并且可以提供更多的并发请求。
编辑:实际上,您还需要使用特殊的响应代码,206部分内容进行响应。我在这个答案的第一个版本中忘记了这一点。现在已修复
很抱歉,如果这似乎是一个愚蠢的问题,但为什么不干脆直接将浏览器重定向到文件? 'header('Location:http:// blablabla');' – 2012-04-23 07:05:51
因为该服务器是我们的媒体文件,唯一可以访问的IP地址就是我们的sodaradio站点的IP地址 – RussellHarrower 2012-04-23 07:11:00
[Mp4视频不会重复玩在iPad](http://stackoverflow.com/questions/3906558/mp4-video-wont-play-in-the-ipad) – JJJ 2012-04-23 07:53:14