Php 为html5音频提供一个mp3/ogg文件

Php 为html5音频提供一个mp3/ogg文件,php,html,http,audio-streaming,Php,Html,Http,Audio Streaming,我试图通过使用HTML5音频标签的浏览器提供音频文件: <audio preload="auto"> <source src="<?php echo $song->getUrl('mp3'); ?>" type="audio/mpeg"> <source src="<?php echo $song->getUrl('ogg'); ?>" type="audio/ogg"> Please update

我试图通过使用HTML5音频标签的浏览器提供音频文件:

<audio preload="auto">
    <source src="<?php echo $song->getUrl('mp3'); ?>" type="audio/mpeg">
    <source src="<?php echo $song->getUrl('ogg'); ?>" type="audio/ogg">
    Please update your browser.
</audio>

其结果是,在Chrome中,歌曲几乎完全播放(9.1MB文件的3.47秒中有3.41秒)。在firefox中,前39秒播放(我猜是512KB)。在opera中,一种永无止境的“加载”状态。

我认为您错误地计算了文件的大小

$contentType = ($format == 'mp3') ? 'audio/mpeg' : 'audio/ogg';
$filePath = $song->getPath($format);
$fileLength = filesize($filePath);
已编辑

$format
是文件扩展名,而不是文件路径 及

,则
206部分内容
响应仅在响应HTTP范围请求时有效:

10.2.7 206部分内容

服务器已完成资源的部分GET请求。请求必须包含一个范围标头字段(第14.35节),指示所需的范围,并且可能包含一个If范围标头字段(第14.27节),以使请求有条件

您的脚本正在为一个请求生成一个206响应,该请求很可能不是针对部分内容的(或者可能是针对与您返回的范围不同的内容),这会让web浏览器感到困惑。在大多数浏览器中,很可能没有逻辑来发出额外请求以获取其余内容,因为这种情况永远不会出现


您的脚本也没有正确处理范围请求!范围包括一个长度,请求中可能存在多个范围。同样,.

Geturl是song类的一个函数,它返回接收扩展名(mp3或ogg)的文件的绝对路径。我完全确定它工作正常,filesize返回的大小也可以。谢谢你的帮助嗨,谢谢你的回复。根据RFC,如果浏览器没有请求,我不能用206代码回答。你知道用什么方法制作HTML标签来请求歌曲文件的各个部分吗?我有一个非常慢的服务器,一首9MB的歌曲需要2分钟才能启动。我认为分割文件,或者在文件100%加载之前开始播放是解决方案。谢谢你的另一个警告,一旦我确定这可以做到,我会记住的。不。在更快的连接上托管音频文件,例如在AmazonS3上。我不敢相信这是不可能的。音频和视频缓冲是存在的,youtube就是这样,goear就是一个例子。我将调查另一种选择。Thanks@gabrielanca,当播放开始需要2分钟时,您认为会发生什么?它正在缓冲…嗨,YouTube播放器,至少对我来说,立即开始播放。当播放时,我看到一个灰色条在增长,所以我相信这意味着YouTube在视频完全下载之前正在播放视频。。。也许我错了,但我确信这一点……为什么你认为把它分成几部分可以节省带宽?如果你想让人们演奏整首曲子,你仍然可以演奏整首曲子。对不起,我犯了一个严重的错误。你完全正确,我不能用这个想法节省带宽。我的意思是,我需要让用户在歌曲完全下载时播放,从而节省用户的时间。谢谢你只需要为你的音频标签启用流媒体。服务器端不需要任何东西。嗨@Brad,谢谢你的回复。我找不到哪个音频标签支持流媒体。我一直在寻找,但什么也没找到。
$contentType = ($format == 'mp3') ? 'audio/mpeg' : 'audio/ogg';
$filePath = $song->getPath($format);
$fileLength = filesize($filePath);
filesize($filePath); // Do not returns file size