我有一个包含视频HTML标记的PHP文件。在源标签的src部分中,我不使用完整的URL,而是使用一个包含呈现视频文件代码的PHP文件。
PHP文件名称后跟一串随机字符,用作实际视频文件名称的密钥。我将这些值存储在$_SESSION中,以便呈现视频文件的PHP文件知道要查找哪个文件。我还使用cookie,以使任何人都无法重复使用令牌。
这在Firefox和Chrome中运行得很好,但在Safari和Android和iOS上尝试的所有移动浏览器中都失败了。
为简单起见,我将整个过程简化为仅使视频呈现PHP文件,而包含HTML标记的PHP文件直接调用该文件,而不使用唯一令牌。
这样做时,有时Safari会加载(非常慢),而移动设备仍然完全失败。
第一个文件的相关部分如下:
另一个文件只是为了检查这个是否有效:
因此,非移动版Safari有时会以非常缓慢的方式加载它。但是,每当我添加任何其他内容(包括将文件名存储在变量中并调用变量作为readfile()函数的参数时,使用会话时,使用cookie时以及基本上任何其他操作),它都会失败。
我尝试了许多其他方法来将文件分成块,因为我认为这就是为什么它在移动设备上无法播放的原因,但是直接将视频文件加载到源标签中没有问题。问题似乎出在我如何调用视频文件上。
我不知道为什么它可以在Firefox和Chrome上运行,但对于上述其他浏览器却无法运行。我现在不确定该怎么办。我甚至不确定我是否正确地表达了问题,因为我的所有谷歌查询都未能产生像我所说的那样的结果。
编辑:我已经添加了我正在使用的完整文件代码。
第一个。
现在来看一下VideoRenderer.php。
PHP文件名称后跟一串随机字符,用作实际视频文件名称的密钥。我将这些值存储在$_SESSION中,以便呈现视频文件的PHP文件知道要查找哪个文件。我还使用cookie,以使任何人都无法重复使用令牌。
这在Firefox和Chrome中运行得很好,但在Safari和Android和iOS上尝试的所有移动浏览器中都失败了。
为简单起见,我将整个过程简化为仅使视频呈现PHP文件,而包含HTML标记的PHP文件直接调用该文件,而不使用唯一令牌。
这样做时,有时Safari会加载(非常慢),而移动设备仍然完全失败。
第一个文件的相关部分如下:
<video>
<source src=\"/videofile.php\" type=\"video/mp4\">
</video>
另一个文件只是为了检查这个是否有效:
readfile('filename.mp4');
因此,非移动版Safari有时会以非常缓慢的方式加载它。但是,每当我添加任何其他内容(包括将文件名存储在变量中并调用变量作为readfile()函数的参数时,使用会话时,使用cookie时以及基本上任何其他操作),它都会失败。
我尝试了许多其他方法来将文件分成块,因为我认为这就是为什么它在移动设备上无法播放的原因,但是直接将视频文件加载到源标签中没有问题。问题似乎出在我如何调用视频文件上。
我不知道为什么它可以在Firefox和Chrome上运行,但对于上述其他浏览器却无法运行。我现在不确定该怎么办。我甚至不确定我是否正确地表达了问题,因为我的所有谷歌查询都未能产生像我所说的那样的结果。
编辑:我已经添加了我正在使用的完整文件代码。
第一个。
<?php
ini_set('session.use_cookies',1);
session_start();
$mp4=uniqid();
$_SESSION[$mp4]='video.mp4';
$ogv=uniqid();
$_SESSION[$ogv]='video.ogv';
echo "
<div style=\"position: relative;padding-bottom: 56.25%;padding-top:35px;height: 0;overflow: hidden;\" oncontextmenu=\"return false\">
<video style=\"position: absolute;top:0;left: 0;width: 100%;height: 100%;\" height=\"540\" width=\"864\" controls>
<source src=\"/videorender.php?video=" . $mp4 . "\" type=\"video/mp4\">
<source src=\"/videorender.php?video=" . $ogv . "\" type=\"video/ogv\">
</video>
</div>
";
?>
现在来看一下VideoRenderer.php。
<?php
ini_set('session.use_cookies',1);
session_start();
$file = $_SESSION[$_GET['video']];
$_SESSION=array();
$params = session_get_cookie_params();
setcookie(session_name(),'', time()-42000,$params["path"],$params["domain"],
$params["secure"], $params["httponly"]);
if(!file_exists($file) || $file === '' || !is_readable($file)){
header('HTTP/1.1 404 File not found',true);
exit;
}
readfile($file);
exit;
?>