SoundCloud 如何流式传输他们的 mp3 文件?

问题描述

我正在尝试使用相同的方法在我的网站上使用 JwPlayer 播放 .mp3 文件,就像 SoundCloud 一样。 我有一个很大的 mp3 文件,有时有 4 个小时的长度。所以我不想在 JwPlayer 中将它作为一个文件加载。 我看到 soundcloud 部分(160k pices)流式传输他们的 mp3 文件。他们是怎么做到的?

enter image description here

我尝试将我的 Nginx 配置为

location /uploads/ {
    mp4;
    mp4_buffer_size       160k;
    mp4_max_buffer_size   200k;
}

但它不起作用。 Mp3 仍然在一个大请求中加载。

我尝试使用 PHP 脚本手动读取文件的选项 2

    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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...