2012-08-14 52 views
1

我有一个tomcat服务器(服务器A),它有一个逐渐流媒体编码mp4视频和MP3音频文件吨,并在私人网络上。我还有一台运行Apache 2和PHP的Web服务器(服务器B),它位于专用网络上并具有面向公众的界面。服务器B管理应用程序ACL。如何通过PHP打开大文件,然后在浏览器中显示以供查看?

我希望客户端(比如浏览器)能够访问服务器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要么耗尽内存或客户端(浏览器)会在开始播放之前下载整个文件。我对此有错误吗?关于我可能做错什么的想法?

回答

0

不,这是它的工作方式。基本上你的php显示文件一个文件。你的PHP脚本是从“我不是一个HTML文件,我是一个MP4文件,这里是我的内容”。 PHP是不是你想要的流式

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

+0

我不确定我了解您的建议。我在浏览器中使用Video.js和/或jPlayer。他们指向服务器B上的PHP脚本。但是,他们在播放之前下载了整个视频。或者,如果视频很大,服务器B上的PHP内存就会耗尽。目前用于调试的PHP内存设置为512MB,甚至无法播放400MB视频。 – thepearson 2012-08-14 01:38:59

0

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

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

我不知道它是否会兑现部分内容的请求,有些东西你必须弄清楚。

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

  1. 文件没有为网络流媒体优化;您可以使用MP4Box对其进行优化(即将元数据标题带到文件的前面)
  2. 文件大小未知;使用上述代理或PHP的header()可以解决。
0

冲洗循环中的缓冲区!

function flush_buffers(){ 
    ob_end_flush(); 
    ob_flush(); 
    flush(); 
    ob_start(); 
} 
相关问题