为什么php函数sleep()会使chrome中的流媒体不可搜索

2guxujil  于 2023-03-11  发布在  PHP
关注(0)|答案(1)|浏览(82)

此代码返回到用户适当的音频文件,可以倒带到任何点。

header("Content-Type: audio/webm");
header("Accept-Ranges: bytes");
header('X-Accel-Buffering: no');
header('Transfer-Encoding: chunked');

$path = "record.webm";
readfile($path);    
die();

此代码使音频在chrome浏览器中无法查找,只是当它完成下载。

header("Content-Type: audio/webm");
header("Accept-Ranges: bytes");
header('X-Accel-Buffering: no');
header('Transfer-Encoding: chunked');

$path = "record.webm";
readfile($path);
sleep(1);
die();

如果我打算把录制的音频逐渐发送给用户,该如何修复这个错误?我已经在考虑在录制完成后从js发出额外的请求,以下载完整的音频文件,但它看起来真的不像是一个很好的优化解决方案。
不间断电源
这只是一个简化的例子,原始代码看起来更像这样:

header("Accept-Ranges: bytes");
header("Cache-Control: max-age=0, must-revalidate, private");
header('X-Accel-Buffering: no');
header('Transfer-Encoding: chunked');

$filesize = filesize($path);
$chunkSize = 8192;
$cursor = 0;
$file = fopen($path, 'r');

while($filesize > $cursor) {
    $chunk = fread($file, $chunkSize);
    $cursor += $chunkSize;

    echo $chunk;
    flush();

    if ($filesize < $cursor + $chunkSize) { //check if the next chunk is last
        sleep(5); //wait if additional data will be recorded
        clearstatcache(true, $path);
        $filesize = filesize($path);
    }
}

fclose($file);

die();
qhhrdooz

qhhrdooz1#

通常,当服务器逐渐发送音频时,它会被分割成很小的音频片段。客户端需要缓冲机制,服务器端需要特殊的分割音频/视频。这并不容易,但幸运的是有标准的解决方案。
如果你想了解它是如何工作的,也许还想编写自己的流客户端脚本,你可以阅读关于Media Source Extensions API的文章。
如果你想要一个简单的解决方案,你可以阅读videojs
我不知道Chrome行为的原因,当你使用Firefox时也会发生同样的情况吗?

相关问题