我有一个<video>and<audio>元素,它通过范围请求从我的服务器加载文件(mp4、mp3,无关紧要)。
然而,该元素似乎只从我的服务器请求结束范围,并从那里开始尝试直接从字节 0 流到末尾,导致播放器陷入“下载循环”,这使得浏览器暂停所有内容其他操作直至下载完成。
有谁知道这个问题的解决方案?例如,我是否必须使我的流请求有一个实际的结束content length或accept-ranges?
这是来自 Chrome 的完整请求列表,在底部您可以看到对该 url 的请求view?watch=v__AAAAAA673pxX一直处于待处理状态,基本上直到element.
简而言之:在使用http-range请求时,html5 元素会陷入下载循环,并导致所有其他请求保持“待处理”状态。
更新
该问题已在服务器端得到解决。
虽然原始流函数实际上会输出每个字节,但我修改了代码以仅输出实际缓冲区的大小。这迫使系统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 += …Run Code Online (Sandbox Code Playgroud)