【发布时间】:2017-05-22 03:14:55
【问题描述】:
我有一个 <video> 和 <audio> 元素,它们通过 Range 请求从我的服务器加载文件(mp4、mp3,没关系)。
然而,该元素似乎只从我的服务器请求结束范围,并且从那里开始尝试直接从字节 0 流式传输到结束,导致播放器卡在“下载循环”中,这使得浏览器暂停所有其他操作,直到下载完成。
有人知道这个问题的解决方案吗?例如,我是否必须让我的流请求真正结束其content length 或accept-ranges?
这是来自 Chrome 的完整请求列表,在底部您可以看到对 url view?watch=v__AAAAAA673pxX 的请求一直处于待处理状态,基本上直到 element 发出新请求为止。
简而言之:当使用http-range 请求时,html5 元素会陷入下载循环,并导致所有其他请求保持“待处理”状态。
更新
问题已在服务器端解决。
虽然原始流函数会输出每个字节,但我已修改代码以仅输出实际缓冲区的大小。这会强制elements 对剩余数据发出新请求。
这里的一个重要注意事项是在每个HTTP RANGE 请求中返回与文件大小、开始和结束位置相匹配的content-length、accept-ranges 和content-ranges。
供日后参考:
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();
}
【问题讨论】:
标签: javascript php html http-headers http-range