什么是'streaming'音频文件的好'chunk size'?



我正在使用http上的另一个答案中的一些代码 - 但不知道什么'块'到网页上的音频标签,我想快速启动...这些文件主要是.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;
}

所有建议似乎都是'吮吸它并看到'!

我尝试了从1K到1024k的一系列尺寸获得各种结果,但没有什么显着的。

我还尝试了可变的块尺寸 - 快速拿出一些曲目的播放,并利用这段时间发送更大的块 - 但再次进行了反复试验。

我还必须对各种设置进行Tweek,以阻止PHP/WebServer等"有用"执行自己的缓存!

我现在已经定居在512k上...似乎和任何(!)一样好。

希望这对某人有帮助!

在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 OKrnTransaction-Id:"..., 16384, 0, NULL, NULL) = 14720
recvfrom(41, "332347330Y271263F3147225271264[16b336_346B[n35033621037110371226373:363"..., 16384, 0, NULL, NULL) = 16384
recvfrom(41, "255W23@10325365A<2614\24625234735017346kH250\&`BU337352346m225"..., 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);

相关内容

  • 没有找到相关文章

最新更新