我有一个
更新:
问题已经在服务器端解决。
原始流函数会输出每个字节,我修改了代码以仅输出实际缓冲区的大小。这迫使
重要的一点是,在每个
供将来参考:
<video>
和<audio>
元素,它通过范围请求从我的服务器加载文件(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();
}
while
循环来输出请求数据。我已经修改了代码,只输出缓冲区大小(例如 (1024 * 1024)),这样一旦达到缓冲区大小,输出流就会关闭。这确保了<video>
/<audio>
必须发起新的数据请求,因为提供的数据与Content-Length
标头不匹配。 - BRO_THOM