此代码返回到用户适当的音频文件,可以倒带到任何点。
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();
1条答案
按热度按时间qhhrdooz1#
通常,当服务器逐渐发送音频时,它会被分割成很小的音频片段。客户端需要缓冲机制,服务器端需要特殊的分割音频/视频。这并不容易,但幸运的是有标准的解决方案。
如果你想了解它是如何工作的,也许还想编写自己的流客户端脚本,你可以阅读关于Media Source Extensions API的文章。
如果你想要一个简单的解决方案,你可以阅读videojs。
我不知道Chrome行为的原因,当你使用Firefox时也会发生同样的情况吗?