【问题标题】:PHP video play on iPad在 iPad 上播放 PHP 视频
【发布时间】:2026-02-22 20:25:01
【问题描述】:

这是我的 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;
?>

【问题讨论】:

  • 很抱歉,这似乎是一个愚蠢的问题,但为什么不直接将浏览器重定向到文件呢? header('Location: http://blablabla');
  • 因为该服务器是我们的媒体文件,唯一能够访问它的 IP 地址是我们 sodaradio 网站的 IP 地址
  • 我不认为它是重复的:另一个问题是关于客户端问题,而这个问题是关于服务器端问题。

标签: php video playback


【解决方案1】:

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 读取的内容发送。这样,您只需要使用一小块内存,就可以处理更多的并发请求。

EDIT :实际上,您还需要使用特殊的响应代码进行响应,即 206 部分内容。我在这个答案的第一个版本中忘记了这一点。现已修复

【讨论】:

  • 那么您能否提供帮助或指出正确的方向来解决此问题
  • 在谷歌上搜索“byte-range php”。您应该能够找到有关如何执行此操作的代码示例。
【解决方案2】:

我正在尝试做同样的事情:一个安全的 PHP 脚本来访问 MP4 视频。

iOS(iPad 和 iPhone)不支持它。

按照本教程,我按照您所说的(字节范围)进行了尝试:

http://mobiforge.com/developing/story/content-delivery-mobile-devices

但是 iPad 从来没有在它的请求中发送“HTTP_RANGE”它:因为它是一个 .php 文件,它为什么要这样做??

我制定了重写规则(access.mp4 -> access.php),即使iOS尝试访问access.mp4,对服务器的请求也没有HTTP_RANGE。

所以,我认为没有办法让安全的 PHP 脚本与 iOS 一起使用...

【讨论】:

  • 打开一个新问题并粘贴您使用的代码(当然已针对私人信息进行了清理)。然后我或其他人可以帮助你。