我有一个<video>
and<audio>
元素,它通过 Range 请求从我的服务器加载文件(mp4、mp3,没关系)。
然而,该元素似乎只从我的服务器请求结束范围,并且从那里开始尝试直接从字节 0 流式传输到末尾,导致播放器陷入“下载循环”,这使得浏览器暂停所有其他操作,直到下载完成。
有谁知道这个问题的解决方案?例如,我是否必须让我的流请求真正结束它的content length
or accept-ranges
?
这是来自 Chrome 的完整请求列表,在底部您可以看到对 url 的请求view?watch=v__AAAAAA673pxX
只是保持挂起状态,基本上直到element
.
简而言之:html5 元素在使用请求时会陷入下载循环,http-range
并导致所有其他请求保持“待处理”状态。
更新
该问题已在服务器端解决。
虽然原始流函数实际上会输出每个字节,但我修改了代码以仅输出实际缓冲区的大小。这会强制对elements
剩余数据提出新的请求。
此处的一个重要注意事项是返回content-length
,accept-ranges
并且content-ranges
与每个HTTP RANGE
请求中的文件大小、开始和结束位置相匹配。
供将来参考:
function stream(){
$i = $this->start;
set_time_limit(0);
while(!feof($this->stream) && $i <= $this->end) {
$bytesToRead = $this->buffer;
if(($i+$bytesToRead) > $this->end) {
$bytesToRead = $this->end - $i + 1;
}
$data = fread($this->stream, $bytesToRead);
echo $data;
flush();
$i += $bytesToRead;
}
}
新的流功能:
function stream()
{
//added a time limit for safe-guarding
set_time_limit(3);
echo fread($this->stream, $this->offset);
flush();
}