视频.JS 可以工作,但当 PHP 用于限制对视频的访问时,会出现怪癖


Video.JS works but with quirks when PHP used to restrict access to video

所以我有一个文件getVideo.php,它需要一个对应于特定视频的get变量$id。 如果我将视频文件保存在 Web 根目录中并直接将其用作源,一切正常。

现在我所做的是将视频放在网络根目录之外,以便我可以使用getVideo.php来确定访问权限。 假设授予了访问权限,则对应于getVideo中视频文件发出的代码部分.php

$filePath = VIDEOBASEURL.$guideData['video_url'];
if (file_exists($filePath)){
    //header('Content-Type: '.mime_content_type($filePath));
    header('Content-Type: video/mp4');
    header('Content-Length: '.filesize($filePath));
    readfile($filePath);
}  

现在这确实可以正常工作,因为当getVideo.php?id=1用作源时,视频将播放。 问题是,不再可能跳到视频的任意部分。 事实上,你根本无法在视频中的任何位置跳跃,无论是向前还是向后,你甚至不能拖动进度表。 您所能做的就是从头到尾观看视频。 我不太确定我做错了什么会导致这种行为。

测试文件实际上是一个.mp4文件,当我直接链接到 Web 根目录中的副本时,一切正常 - 只是当它通过访问控制的 getVideo.php 版本时,我无法在视频中跳过。 相反,单击以向前跳过只会暂停视频。

编辑 - 这实际上与视频.js无关。 尝试直接从getVideo.php文件观看视频,因此使用Chrome/Firefox内置的任何内容,即使在那里,视频也无法跳转。 所以我猜我以某种方式错误地返回了视频文件。

这很可能是因为您正在尝试从 PHP 文件流式传输视频。每次请求该 PHP 文件时,它都必须重新读取 mp4 文件,而不是让服务器在文件中的指定点返回字节。从长远来看,这种方法可能行不通,您应该考虑仅限制对带有视频元素的页面的访问。

本主题的关键字是"字节范围请求"。

我认为今天的每个浏览器都尝试使用 HTTP 标头中的HTTP_RANGE加载视频,告诉服务器只发送文件的特定部分。在移动设备上,没有其他方法可以将视频加载到网页中。
所以你必须在PHP中自己处理范围请求。
以这种方式发送视频,您将能够搜索视频中的任何位置,即使它尚未缓冲(对于 Flash 播放器来说并非如此!在快速我找到这个页面。在"附录 A:Apple iPhone 流媒体"中,您将找到一个 PHP 脚本,您可以轻松扩展该脚本以进行权限检查。mobiforge.com/design-development/content-delivery-mobile-devices

我没有检查脚本,但它看起来不错。我在视频资产管理系统上使用了相同的方法,并且它没有任何问题。上面的 PHP 示例没有处理"多字节范围"请求,但我认为这对视频无关紧要。我发现唯一使用多字节范围请求的客户端是Adobe PDF阅读器插件。

这种方法也适用于任何类型的下载,以允许浏览器恢复下载或下载管理器插件下载多个流中的一个文件。

有关整个故事,请参阅:www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.1

编辑:
我刚刚在该PHP脚本中发现了一个错误:在函数 rangeDownload() 中搜索该行

if ($range0 == '-') {

并将其替换为:

if ($range[0] == '-') {

如果浏览器不发送HTTP_RANGE请求,也存在问题。在这种情况下,脚本将使用 PHP readfile()。我认为readfile()将整个文件读入内存(至少过去是这样)。对于向许多用户提供视频,这是一个严重的问题。所以不要对大文件使用 readfile()。而是以块形式发送文件,如脚本末尾的"//开始缓冲下载"所示。

我希望没有其他问题。