2012-03-11 128 views
1

我試圖用PHP流媒體文件並在瀏覽器上播放它。 我使用Ubuntu的服務器(Apache)和客戶端進行測試。我的代碼適用於Chrome,但不適用於FireFox。 當我直接訪問mp3(所以它是由Web服務器提供的)時,它也可以在FireFox上工作,但是將Web服務器生成的頭文件與我用PHP發送的頭文件進行比較,我找不到如何解決該問題。 (我使用間諜的螢火頭)使用PHP在Linux +流媒體MP3 + FireFox

這裏是Web服務器生成的標頭(即不工作):

Accept-Ranges bytes 
Connection Keep-Alive 
Content-Length 490265 
Content-Type audio/mpeg 
Date Sun, 11 Mar 2012 04:01:45 GMT 
Etag "22064e-77b19-4badff4a88200" 
Keep-Alive timeout=5, max=100 
Last-Modified Sat, 10 Mar 2012 09:15:52 GMT 
Server Apache/2.2.20 (Ubuntu) 

下面是從我的PHP腳本發送到瀏覽器的標題:

Accept-Ranges bytes 
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection Keep-Alive 
Content-Length 490265 
Content-Type audio/mpeg 
Date Sun, 11 Mar 2012 04:16:00 GMT 
Expires Thu, 19 Nov 1981 08:52:00 GMT 
Keep-Alive timeout=5, max=100 
Pragma no-cache 
Server Apache/2.2.20 (Ubuntu) 
X-Powered-By PHP/5.3.6-13ubuntu3.6 

這是我使用流式傳輸的MP3代碼:

header('Content-length: ' . filesize($path)); 
header('Content-Type: audio/mpeg'); 
header('Accept-Ranges: bytes'); 

readfile($path); 

exit; 

我也試過其他頭沒有幫助,如:

header('Content-Disposition: inline; filename="name.mp3"'); 
header('Expires: '.gmdate('D, d M Y H:i:s').' GMT'); 
header('Pragma: no-cache'); 
header('Cache-Control: no-cache'); 

但就像我說的,這些都沒有解決這個問題。

非常感謝您的幫助,

Oded。

編輯:

好吧,這似乎是非常奇怪的。經過很多調試之後,我確信PHP版本和Web服務器版本的標頭和內容是相同的,然後我發現它破壞了它,但我不知道爲什麼。這是它打破它的場景:

  • 1)在前面的腳本中存儲$ _SESSION的路徑的字符串。
  • 2)在流式傳輸mp3的腳本中讀取此字符串。
  • 3)使用此字符串作爲加載mp3文件的路徑。

如果我這樣做,FireFox無法播放該文件,當我按下MP3播放器時,它會打印一個「GstDecodeBin2:這看起來像是一個文本文件」消息。 如果我硬編碼的路徑,而不是使用$ _SESSION,它的作品。瘋狂的事情是我絕對確信$ _SESSION中的路徑是正確的!請記住PHP和Web服務器版本的標題和內容是相同的!

+0

*你的腳本實際上是否在範圍內? – 2012-03-11 04:49:04

+0

我不這麼認爲,我不知道範圍是什麼意思,我只是添加了這個標題,因爲我看到web服務器添加了它。 – 2012-03-11 08:38:12

回答

0

HTTP Accept-Ranges標頭允許瀏覽器發送要下載的文件的起點和終點,這允許多部分下載同一個文件。這裏有大量的PHP實現,這裏是在frenet()的PHP.net文檔頁面上找到的。

http://www.php.net/manual/en/function.fread.php#106999

+0

謝謝,這是重要的信息,但沒有解決問題,瀏覽器在這種情況下不請求範圍。我懷疑問題可能出在緩存控制上,因爲您可以看到PHP發送的頭文件中存在一些差異:它會發送「Cache-Control no-store,no-cache,must-revalidate,post-check = 0,預檢查= 0「和」Pragma no-cache「。我會盡力阻止PHP發送這些頭文件。 – 2012-03-11 21:47:57

+0

我編輯的問題,因爲評論太長,請參閱上文。 – 2012-03-15 03:42:13

0

我發現了什麼問題,使用Wireshark來監視請求。早些時候我使用FireBug和HTTPFox,他們不顯示所有請求!

WireShark向我展示了在最初的成功請求之後,對同一個URI有另一個請求。第二個請求沒有被xdebug捕獲,並且被FireBug和HTTPFox忽略。問題是這個請求不包含PHPSESSID!顯然結果會議不起作用,並且因爲它在第一次請求上工作,我感到困惑。 這對我來說就像是一個FireFox中的媒體播放器模塊中的錯誤。 我可以通過手動將PHPSESSID添加到URL作爲查詢字符串來解決此問題。