2010-10-21 31 views
1

我建了一個mp3播放網站。php流式或緩衝mp3文件問題

我用一個MP3播放器播放MP3 file.It可以玩,但不能加載正確的時間,而不是流和緩衝區位於我的服務器上的MP3文件。

它可以正常播放MP3文件如果URL是從其他網站,如谷歌音樂。

我認爲重要的問題是mp3文件的頭部輸出。

這是我的PHP文件輸出的MP3文件的代碼。

<?php 
$filename='music/'.$_GET['id'].'.mp3'; 
$fileSize=filesize($filename); 
header('Accept-Ranges: bytes'); 
header('Cache-Control: max-age=604800'); 
header('Content-Length: ' . $fileSize); 
header('Content-type: audio/mpeg'); 
readfile($filename); 
?> 

誰能告訴我什麼`的問題是什麼? PS:你可以在Chrome上測試。只需使用Chrome打開文件或頁面,就會顯示播放器播放mp3文件。

+0

最不同的流化或unstreamable文件的是:如果你使用Chrome打開MP3文件,你可以看到負載狀態(藍色),你可以(使用滾動條)打任何位置上的任何時候。如果打開不可複製的mp3文件,則無法看到加載狀態,並且無法在任何時候播放。 – Angolao 2010-10-21 14:22:52

+0

其實我試過fopen()和readfile(),它不會同時工作 – Angolao 2010-10-21 14:59:09

回答

2

OK,解決了這個問題。實際的問題是Liunx系統(如CentOS和Ubuntu)不支持MP3串流。

爲了解決這個問題,你必須安裝GNUMP3d來使流服務器。

我的網站現在mu6.me可以發揮像其他音樂網站的音樂。

3

我也遇到過這個問題。我用PHP的readfile()-function解決了它。我不知道它爲什麼起作用,但它確實如此。此外,它縮短了您的代碼,並使用更少的內存:

$filename = 'music/'.$_GET['id'].'.mp3'; 
header('Cache-Control: max-age=604800'); 
header('Content-type: audio/mpeg'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: '.filesize($filename)); 
readfile($filename); 
+0

我在Chrome上試過了,它不起作用。 – Angolao 2010-10-21 14:55:06

1

爲一體,採用「接受範圍,」頭信息意味着你的腳本是告訴瀏覽器,它可以請求文件的特定部分,但你無條件發送整個事情。至少切換到使用none而不是bytes來表明您不允許範圍請求,或者完全消除標題。

其次,這樣做的:

print(fread($mp3, $fileSize - 10000)); 

是奇數。不管mp3的實際大小如何,您最多隻能發送兩個大塊文件。第一個塊將是整個文件減去最後10,000個字節,而第二個塊(如果該文件的> 10,000個字節長)將是最終的最多10,000個字節。如果你有一個很大的MP3,以這種方式發送它可能會超過PHP的memory_limit並殺死腳本。 MP3播放器可能不會注意到這一點,因爲它可以愉快地播放已發送的曲調部分。而不是整個fopen/while/fclose業務,只需使用readfile(),它將以足夠小的塊正確發送文件,以便不超過內存限制。

+0

「Accept-Ranges:bytes」標題是我在Google音樂上找到的標題。而且我還測試了「Accept-Ranges:none」或者將其消除,但它仍然不起作用。 – Angolao 2010-10-21 15:17:47

1

你試過添加文件名嗎?

header('Content-Disposition: attachment; filename="media.mp3"'); 
header('Pragma: no-cache'); 

希望這有助於

+0

'Content-Disposition:attachment'將導致瀏覽器下載文件。 – Angolao 2010-10-21 16:05:43

+0

是的,當文件作爲附件處理時,一些閃光燈拖纜效果更好 – RobertPitt 2010-10-22 07:49:59