这是我的 PHP 视频代码 它可以在浏览器中运行,但当我尝试让它在 iPhone 和 iPad 上播放时,它似乎会调出带有 x 的播放按钮。
<?php
header('Content-type: video/mp4');
$homepage = file_get_contents('http://cdn.videos.budtraffic.com/sodaradio/J/Jessie%20J%20-%20Laserlight.mp4');
echo $homepage;
exit;
?>
最佳答案
简短回答:
因为 iOS 设备要求服务器支持视频的字节范围请求,而您的代码不提供该功能。
长答案:
当 iOS 设备请求视频时,它们不会下载整个视频。他们一次只下载一小块,以最大限度地减少带宽使用,而且还因为用户可能想跳到视频的后面部分而不下载前面的部分。为此,他们提出字节范围请求。基本上,它们告诉服务器“嘿,给我文件第 100 到 200 个字节之间的部分”。字节范围请求使用 Range
header ,如下所示
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
header 。此信息可在 $_SERVER['HTTP_RANGE']
全局变量中获取。然后,您将只需要获取文件的该部分并将其发送到客户端。您还需要填充 Content-Range
header 。
请注意,Content-Range
header 包含完整的文件大小,因此您的代码需要提供该信息。另请注意,几乎每个服务器都支持这种对静态文件的请求。如果您不需要对文件进行特殊处理,一个可能的选择是将文件复制到公共(public)服务器上并让它为您完成工作。
不相关的评论
将此视为建设性批评,但当前形式的代码将使您的服务器崩溃。基本上,您在发送之前将整个文件放入内存中,更糟糕的是,您对每个请求都这样做。如果 100 人同时下载 100MB 的视频,则服务器上需要 10 GB 内存来为他们提供服务。这无法扩展,根本无法扩展。
更好的解决方案是使用 readfile 发送从 CDN 读取的文件。功能。这样,您只需要使用一小块内存,就可以处理更多的并发请求。
编辑:实际上,您还需要使用特殊的响应代码(206部分内容)进行响应。我在这个答案的第一个版本中忘记了这一点。现已修复
关于iPad 上的 PHP 视频播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10275730/