PHP 读取另一个扩展名的 MP4 文件

PHP read MP4 file with another extension

我在博物馆工作,我们的网站上有很多 .MP4 视频。我将它们的扩展名更改为 .MUS 以使其更难下载(大多数人不知道如何右键单击该网页,单击 <video> 标记下载它然后重命名)。视频显示正常。看起来像这样:

<video width='640px' height='480px' controls='controls' />
  <source type='video/mp4' src='dinos.mus'>   ◄█■■■
</video>

现在我将视频移动到 WWW 之外的受保护目录,然后我使用 PHP 阅读它们,如下所示:

<video width='640px' height='480px' controls='controls' />
  <source type='video/mp4' src='open_file.php?file=dinos.mp4'>   ◄█■■■
</video>

这是 open_file.php :

header( "Content-Type: video/mp4" );
readfile( "/home/" . $_GET["file"] );

它工作正常...直到我将扩展名从 .MP4 更改为 .MUS,然后视频不再显示:

<video width='640px' height='480px' controls='controls' />
  <source type='video/mp4' src='open_file.php?file=dinos.mus'>   ◄█■■■
</video>

我不明白为什么:这是同一个文件,我发送正确的 header 和 PHP,<video> 标签有正确的类型。实际上,如果没有 PHP,<video> 标签可以很好地处理 .MUS 文件,所以问题似乎是 PHP.

我的问题是:如何读取 .MUS 文件并将其发送以被解释为 MP4?

我认为 .MUS 文件的 MIME 类型是 application/octet-stream
header( "Content-Type: application/octet-stream" );

我已经测试了你的代码,Content-Type: video/mp4 和 readfile 应该可以工作(它应该与文件扩展名无关,想象一下如果你从 BLOB 中获取文件数据,它也应该工作)

但是如果home目录是相对目录,那么请使用“./home/”而不是“/home/”

确保目录/文件权限设置正确。假设确保主目录是可执行的(主目录为 chmod a+x)并且 mus 文件是可读的(MUS 文件为 chmod a+r)

所以这个 open_file.php 有效:

<?php
header("Content-Type: video/mp4");
readfile("./home/" . $_GET["file"]);
?>

在此处查看工作示例:

http://www.createchhk.com/SO/testSO20Nov2021b.php

代码如下:

<video width='640px' height='480px' controls='controls' />
  <source type='video/mp4' src='open_file.php?file=test2.mus'> 
  </video>

这并不能真正保护文件。您可以通过将文件托管在另一台服务器上来保护该文件,缓冲视频,然后为下一个用户重命名该文件,有效地删除该文件,直到它被重新加载。不过,这需要一些时间来编写代码。

不过,执行此操作的另一种方法是使用 blob url。这些是 YouTube 使用的内容,它阻止人们轻松找到视频 URL。

您可以使用下面的 PHP 代码来执行此操作:

<?php // php at top of page
    $video = file_get_contents('./location/to/file/from/page.mp4');
    $video_code = base64_encode($video);
?>

然后,在你有视频文件的地方,你可以这样做:

<video width='640px' height='480px' controls='controls' controlslist='nodownload' />
   <source type='video/mp4' src='<?php echo $video_code; ?>'>
</video>

如果有人试图抓取视频 URL 并打开它,它会告诉他们文件已被移动。他们也无法下载该文件。我还建议在视频中添加 oncontextmenu='return false;' 以提高安全性。