“流媒体”音频文件有什么好的“块大小”?

时间:2015-05-01 11:21:16

标签: php audio stream

我正在使用来自另一个答案的一些代码来通过http传输音频 - 但不知道什么'chunksize'最好...文件可能非常大,并且流式传输到网页上的音频标签,我想快速启动......文件主要是.wav和.mp3

function streamfile($filename, $retbytes = TRUE) {
    $CHUNK_SIZE = 1024*1024; // Size (in bytes) of tiles chunk
    $buffer = '';
    $cnt =0;
    // $handle = fopen($filename, 'rb');
    $handle = fopen($filename, 'rb');
    if ($handle === false) {
        return false;
    }
    while (!feof($handle)) {
        $buffer = fread($handle, $CHUNK_SIZE);
        echo $buffer;
        ob_flush();
        flush();
        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }
    $status = fclose($handle);
    if ($retbytes && $status) {
        return $cnt; // return num. bytes delivered like readfile() does.
    }
    return $status;
}

2 个答案:

答案 0 :(得分:0)

所有建议似乎都是“吮吸并看到”!

我尝试了从1k到1024k的各种尺寸获得各种结果,但没什么了不起。

我还尝试了可变的块大小 - 快速获取一些内容并使用该时间发送更大的块 - 但同样是它,试验和错误。

我还必须调整各种设置来阻止PHP / webserver等“帮助”进行自己的缓存!

我现在已经确定了512k ......看起来和任何(!)一样好。

希望这有助于某人!

答案 1 :(得分:0)

在Linux系统上如果使用命令strace监视系统活动,您很快就会发现脚本的局限性。
例如,监控curl请求的性能,您可能会发现带宽是限制因素 它可能会显示为示例:

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 41
fcntl(41, F_GETFL)                      = 0x2 (flags O_RDWR)
fcntl(41, F_SETFL, O_RDWR|O_NONBLOCK)   = 0
connect(41, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("<some.ip>")}, 16) = -1 EINPROGRESS (Operation now in progress)
sendto(41, "GET /some-service/some"..., 3480, MSG_NOSIGNAL, NULL, 0) = 3480
recvfrom(41, "HTTP/1.1 200 OK\r\nTransaction-Id:"..., 16384, 0, NULL, NULL) = 14720
recvfrom(41, "\332\347\330Y\271\263F\314\7\225\271\264[16b\336_\346B[\n\350\336\210\371\10\371\226\373:\363"..., 16384, 0, NULL, NULL) = 16384
recvfrom(41, "\255W\23@\10\325\365A<\26\1\4\\\246\252\347\350\17\346kH\250\\&`BU\337\352\346m\225"..., 16384, 0, NULL, NULL) = 12223
close(41)                               = 0

在本例中,您会看到您收到3个包含14,16和12 kB的包,默认情况下上限为16kB。 由于带宽限制不允许在所需的读取时间限制内填满内部缓冲区,因此未填充第一个包。 如果要更改PHP引擎的内部块限制,可以使用以下命令来执行此操作:

$handle = fopen($filename, 'rb');
stream_set_chunk_size($handle, $CHUNK_SIZE);
stream_set_read_buffer($handle, $CHUNK_SIZE);