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.1 MB のファイルの 3.47 秒のうち 3.41 秒)。Firefox では、最初の 39 秒が再生されました (512KB だと思います)。オペラでは、終わることのない「読み込み中」の状態。