iPad 上的 PHP 视频播放

标签 php video playback

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

最佳答案

Explanation on Apple Web site

简短回答:

因为 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/

相关文章:

php - 如何使用 Vala 编程语言制作 PHP 模块?

PHP FFMPEG,如何确保结果视频适合网络浏览器?

php - ffmpeg后台进程完成后如何管道新命令?

android - 如何查看哪个用户在 Google Play 中上传了 apk 文件?

php - 如何正确使用 PDO::FETCH_SERIALIZE?

javascript - Telegram API 使用 php 或 javascript 发送消息?

PHP 字符串/日期替换正则表达式

c# - 在 ASP.NET 项目中运行 FFMPEG 时不断收到 WIN32Exception

ios - 记录用户与界面的交互

ios - 在 iOS 上实时录制、修改音高和播放音频