如何使用PHP通过HTTP打开大型文件,然后在浏览器中显示以供查看?

如何使用PHP通过HTTP打开大型文件,然后在浏览器中显示以供查看?,php,http,video,Php,Http,Video,我有一个tomcat服务器(服务器a),它有大量渐进式流式编码的mp4视频和mp3音频文件,并且位于专用网络上。我还有一个运行Apache2和PHP的web服务器(服务器B),它位于专用网络上,具有面向公共的接口。服务器B管理应用程序ACL 我希望客户端(比如浏览器)能够转到服务器B的公共界面上的特定url,并能够从专用服务器下载(在播放器中收听或查看)媒体。目前,在服务器B上,我尝试了以下操作: <?php $handler = fopen('http://server_a/path/t

我有一个tomcat服务器(服务器a),它有大量渐进式流式编码的mp4视频和mp3音频文件,并且位于专用网络上。我还有一个运行Apache2和PHP的web服务器(服务器B),它位于专用网络上,具有面向公共的接口。服务器B管理应用程序ACL

我希望客户端(比如浏览器)能够转到服务器B的公共界面上的特定url,并能够从专用服务器下载(在播放器中收听或查看)媒体。目前,在服务器B上,我尝试了以下操作:

<?php
$handler = fopen('http://server_a/path/to/file.mp4', 'r');
header('Content-type: video/mp4');
while (!feof($handler)) {
    print fread($handler, 8192);
}
exit;

不,这就是它的工作方式。基本上,php将文件显示为一个文件。您的PHP脚本来自“我不是HTML文件,我是MP4文件,以下是我的内容”。PHP不是流媒体所需要的


为什么不尝试使用HTML5视频或音频,指向您的PHP脚本?

第一个和第三个选项不应该耗尽内存,但是,我建议在服务器B上为特定路径设置代理(例如
/path/to/videos/

我不确定它是否会满足部分内容请求,这是你必须弄清楚的

其次,有两件事可以解释为什么浏览器必须在播放之前下载整个文件:

  • 该文件未针对web流媒体进行优化;您可以使用MP4Box对其进行优化(即将元数据头放在文件的前面)
  • 文件大小未知;使用前面提到的代理或可以解析的PHP的
    header()

  • 刷新循环中的缓冲区

    function flush_buffers(){
       ob_end_flush();
       ob_flush();
       flush();
       ob_start();
    }
    

    我不确定我是否理解你的建议。我正在浏览器中使用Video.js和/或jPlayer。他们指向服务器B上的PHP脚本。但是,他们在播放之前下载了整个视频。或者,如果视频很大,服务器B上的PHP内存就会耗尽。目前用于调试的PHP内存设置为512MB,但仍然无法播放400MB的视频。
    <?php
    $handler = fopen('http://server_a/path/to/file.mp4', 'r');
    header('Content-type: video/mp4');
    fpassthru($handler);
    exit;
    
    function flush_buffers(){
       ob_end_flush();
       ob_flush();
       flush();
       ob_start();
    }