2012-08-14 57 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(); 
} 
相關問題