我正在尝试使用 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>
我需要节省流量,所以我想用这种方式发送部分内容:
$contentType = ($format == 'mp3') ? 'audio/mpeg' : 'audio/ogg';
$filePath = $song->getPath($format);
$fileLength = filesize($filePath);
$start = 0;
if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])) {
$http_range = explode('-', substr($_SERVER['HTTP_RANGE'], strlen('bytes=')));
$start = $http_range[0];
}
$remainingBytes = $fileLength - $start;
$length = min((512*1024), $remainingBytes);
$final = $start + $length;
header('HTTP/1.1 206 Partial Content');
header('Status: 206 Partial Content');
header('Content-Type: ' . $contentType);
header('Content-Disposition: inline;filename="listen.' . $format . '"');
header('Content-length: ' . $length);
header('Content-Transfer-Encoding: bytes');
header('Accept-Ranges: bytes');
header('Cache-Control: no-cache');
header('Content-Range: bytes ' . $start . '-' . $final . '/' . $fileLength);
echo file_get_contents($filePath, false, null, $start, $length);
这样做的结果是,在 Chrome 中,歌曲几乎完全播放(9.1MB 文件的 3.47 秒中有 3.41 秒)。在 Firefox 中,播放前 39 秒(我猜是 512KB)。在歌剧中,一个永无止境的“加载”状态。