1

我有一个 tomcat 服务器(服务器 A),它有大量渐进式流式编码的 mp4 视频和 mp3 音频文件,并且位于专用网络上。我还有一个运行 Apache 2 和 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
$handler = fopen('http://server_a/path/to/file.mp4', 'r');
header('Content-type: video/mp4');
print stream_get_contents($handler);
exit;

<?php
$handler = fopen('http://server_a/path/to/file.mp4', 'r');
header('Content-type: video/mp4');
fpassthru($handler);
exit;

所有这些 PHP 要么内存不足,要么客户端(浏览器)在开始播放之前下载整个文件。我在这件事上走错了吗?关于我可能做错了什么的任何想法?

4

3 回答 3

0

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

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

于 2012-08-14T01:31:40.250 回答
0

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

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass

我不确定它是否会满足部分内容请求,您必须弄清楚这一点。

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

  1. 该文件未针对网络流媒体进行优化;您可以使用 MP4Box 对其进行优化(即将元数据标题放在文件的前面)
  2. 文件大小未知;使用可以解决的上述代理或 PHP header()
于 2012-08-14T01:38:15.327 回答
0

刷新循环上的缓冲区!!!

function flush_buffers(){
   ob_end_flush();
   ob_flush();
   flush();
   ob_start();
}
于 2016-03-06T02:22:57.610 回答