2012-03-11 129 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作为查询字符串来解决此问题。