我有一个包含视频HTML标记的PHP文件。我使用的PHP文件包含呈现视频文件的代码,而不是在源标记的src部分使用完整的URL。
PHP文件名附加一个随机字符串,用作实际视频文件名的键。我将这些值存储在$ _SESSION中,以便呈现视频文件的PHP文件将知道要查找的文件。我也有它使用cookie,以便没有人可以重复使用令牌。
这在Firefox和Chrome中效果很好,但对于我在Android和iOS上尝试的所有移动浏览器都无法使用。
为了简单起见,我删除了整个过程以简单地使用视频呈现PHP文件,而包含HTML标记的PHP文件直接调用该文件而不使用唯一标记。
当我这样做时,有时Safari会加载它(非常慢)并且移动设备仍然是完全失败的。
第一个文件的相关部分如下所示:
<video>
<source src=\"/videofile.php\" type=\"video/mp4\">
</video>
另一个文件只是为了看看它是否有效:
readfile('filename.mp4');
因此,非移动Safari有时会加载它(非常慢)。但是,每当我添加其他内容时总是会失败,包括将文件名存储在变量中,并在readfile()中调用变量作为参数,每当我使用会话,使用cookie时,基本上都是其他任何东西。
我尝试了许多其他方法将文件分解成块,因为我认为这是为什么它不能在移动设备上播放,但将视频文件直接加载到源标签中没有问题。问题似乎在于我如何调用视频文件。
我不知道为什么它适用于Firefox和Chrome,但它不适用于上述其他人。我不知道此时该怎么做。我甚至不确定我是否正确地表达了这个问题,因为我的所有Google查询都未能产生类似于我所说的内容。
编辑:我已经使用
添加了完整的文件代码第一个
<?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;
?>
答案 0 :(得分:0)
您是否比较了PHP脚本与直接嵌入视频文件之间的http headers
?
您必须发送Content-Type:video/mp4
,例如:
header("Content-Type:video/mp4");
Content-Length
标题也是一个好主意:
header('Content-Length: '.filesize($videoFile));
还有一些其他情况,例如某些浏览器发送多个请求。在此处查看类似问题:https://stackoverflow.com/a/3125869/2797243
另一方面:通过php管道视频文件是一个非常糟糕的想法(服务器性能),就像你描述的那样。使用这种方法,您将得不到满足您的解决方案。
如果你想实现类似授权的东西,最好的方法是使用流媒体服务器。无论视频是流式传输还是以渐进式下载形式提供。
我能想到的唯一解决方案是对视频文件进行http redirect
。但我想这也可能会失败,特别是对于移动设备这样的原生播放器。