问题描述
我正在尝试使用相同的方法在我的网站上使用 JwPlayer 播放 .mp3 文件,就像 SoundCloud 一样。 我有一个很大的 mp3 文件,有时有 4 个小时的长度。所以我不想在 JwPlayer 中将它作为一个源文件加载。 我看到 soundcloud 部分(160k pices)流式传输他们的 mp3 文件。他们是怎么做到的?
我尝试将我的 Nginx 配置为
location /uploads/ {
mp4;
mp4_buffer_size 160k;
mp4_max_buffer_size 200k;
}
但它不起作用。 Mp3 仍然在一个大请求中加载。
if (isset($_SERVER['HTTP_RANGE'])) {
$c_start = $start;
$c_end = $end;
list(,$range) = explode('=',$_SERVER['HTTP_RANGE'],2);
if (strpos($range,',') !== false) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
exit;
}
if ($range == '0-') {
$c_start = 0;
}
else {
$range = explode('-',$range);
$c_start = (int)$range[0];
if($c_start > 2407200) {
exit;
}
$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $c_start + $end;
}
$c_end = ($c_end > $size) ? $size : $c_end;
if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
exit;
}
$start = $c_start;
$end = $c_end;
$length = $end - $start + 1; // Calculate new content length
fseek($fp,$start);
header('HTTP/1.1 206 Partial Content');
}
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: $length");
$buffer = 1024 * 8;
while(!feof($fp) && ($p = ftell($fp)) <= $end) {
if ($p + $buffer > $end) {
$buffer = $end - $p + 1;
}
set_time_limit(0); // Reset time limit for big files
echo fread($fp,$buffer);
flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
}
fclose($fp);
还不错,但是当我停止播放 mp3 时,脚本会加载其他文件。
那么 SoundCloud 如何做到这一点?当播放音乐时,它们会以小片段加载音乐,当停止播放器时,请求也会停止。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)