获取 "buffered.end(0)" 的最后一个索引?
Get last index of "buffered.end(0)"?
以下代码告诉我视频已加载多远。 returned 值以百分比表示:
//Tell JS what video to look for
v = document.getElementById("my-video-id");
//[...]Functions that triggers debuglog() every second at the right time[...]
function debuglog(){
loadedpercentage=v.buffered.end(0) / v.duration * 100;
//A.K.A
//Video s loaded content, in seconds
//Divided by:
//Total video time, in seconds
//Multiplied by 100.
console.log(loadedpercentage);//Returns loaded percentage! Eg: 5.382738332.
}
因此,如您所见,此函数每次触发时都会 return 到目前为止视频的加载百分比。
只有一个问题:
当用户暂停并播放视频时,会创建一个新缓冲区,这意味着我们无法再使用v.buffered.end(0)
。我们现在必须使用 v.buffered.end(1)
.
我知道,我可以告诉 play/pause 操作,例如,将新的缓冲区编号传递给 buffered.end
。我只是想知道是否可以简单地将 javascript 告诉 "use the last one"、"use the last buffer"。我正在考虑这样的事情,也许吧?
v.buffered.end(this.lastbuffer);
解决此问题的最佳方法是什么?
再次感谢,非常感谢!
== 编辑 ==
非常感谢@Kaiido 的回答和解释!
以下是如何获取可用于 buffered.end
的最后一个缓冲区:
v = document.getElementById("video");//Your video ID
console.log(v.buffered.end(v.buffered.length-1));
以上代码在控制台中以秒为单位输出所需的值。
请参阅此 post 下的已批准答案,以进一步解释如何获得 真实 加载百分比。
干杯:)
有个length
property on the TimeRanges returned by HTMLMediaElement.buffered:
vid.onseeked = e => {
console.log(vid.buffered.length);
}
video{height: 200px;margin-bottom:100vh}
<video id="vid" controls src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm"></video>
随便用。
但请注意,您在这里测量的不是加载百分比本身。为此,您需要遍历所有 TimeRanges 并获取它们的长度,然后计算这个整体相对于总长度的比率:
vid.onseeked = e => {
const buffers = vid.buffered;
let buffered = 0;
for(let i = 0; i<buffers.length; i++) {
buffered += buffers.end(i) - buffers.start(i);
}
console.log((buffered / vid.duration) * 100, '%');
}
video{height: 200px;margin-bottom:100vh}
<video id="vid" controls src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm"></video>
我认为以下内容可行。让我知道。
//<!CDATA[
/* js/external.js */
var doc, bod, I; // for use on other loads
addEventListener('load', function(){
doc = document; bod = doc.body;
I = function(id){
return doc.getElementById(id);
}
var vid = I('vid'), prog = I('prog'), loaded = I('loaded'), progI;
vid.onloadedmetadata = function(){
var n = 0, d = this.duration;
progI = setInterval(function(){
if(n < d){
n = 0;
for(var i=0,b=vid.buffered,p,l=b.length; i<l; i++){
n += (b.end(i)-b.start(i))/d;
}
p = Math.round(n*100);
if(p === 100)n = d;
prog.value = p; loaded.innerHTML = p+'%';
}
else{
clearInterval(progI); progI = undefined;
}
}, 500);
}
vid.src = 'https://www.w3schools.com/html/mov_bbb.mp4';
}); // end load
//]]>
/* css/external.css */
*{
box-sizing:border-box; padding:0; margin:0;
}
html,body{
width:100%; height:100%;
}
body{
background:#ccc;
}
#content{
padding:7px; text-align:center;
}
#vid,#prog{
display:block; width:400px; margin:0 auto;
}
#vid{
height:220px;
}
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
<meta charset='UTF-8' /><meta name='viewport' content='width=device-width, height=device-height, initial-scale:1' />
<title>Test Template</title>
<link type='text/css' rel='stylesheet' href='css/external.css' />
<script type='text/javascript' src='js/external.js'></script>
</head>
<body>
<div id='content'>
<video id='vid' type='video/mp4' controls='controls'></video>
<progress id='prog' value='0' max='100'></progress>
<div id='loaded'>0%</div>
</div>
</body>
</html>
以下代码告诉我视频已加载多远。 returned 值以百分比表示:
//Tell JS what video to look for
v = document.getElementById("my-video-id");
//[...]Functions that triggers debuglog() every second at the right time[...]
function debuglog(){
loadedpercentage=v.buffered.end(0) / v.duration * 100;
//A.K.A
//Video s loaded content, in seconds
//Divided by:
//Total video time, in seconds
//Multiplied by 100.
console.log(loadedpercentage);//Returns loaded percentage! Eg: 5.382738332.
}
只有一个问题:
当用户暂停并播放视频时,会创建一个新缓冲区,这意味着我们无法再使用v.buffered.end(0)
。我们现在必须使用 v.buffered.end(1)
.
我知道,我可以告诉 play/pause 操作,例如,将新的缓冲区编号传递给 buffered.end
。我只是想知道是否可以简单地将 javascript 告诉 "use the last one"、"use the last buffer"。我正在考虑这样的事情,也许吧?
v.buffered.end(this.lastbuffer);
解决此问题的最佳方法是什么?
再次感谢,非常感谢!
== 编辑 ==
非常感谢@Kaiido 的回答和解释!
以下是如何获取可用于 buffered.end
的最后一个缓冲区:
v = document.getElementById("video");//Your video ID
console.log(v.buffered.end(v.buffered.length-1));
以上代码在控制台中以秒为单位输出所需的值。
请参阅此 post 下的已批准答案,以进一步解释如何获得 真实 加载百分比。
干杯:)
有个length
property on the TimeRanges returned by HTMLMediaElement.buffered:
vid.onseeked = e => {
console.log(vid.buffered.length);
}
video{height: 200px;margin-bottom:100vh}
<video id="vid" controls src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm"></video>
随便用。
但请注意,您在这里测量的不是加载百分比本身。为此,您需要遍历所有 TimeRanges 并获取它们的长度,然后计算这个整体相对于总长度的比率:
vid.onseeked = e => {
const buffers = vid.buffered;
let buffered = 0;
for(let i = 0; i<buffers.length; i++) {
buffered += buffers.end(i) - buffers.start(i);
}
console.log((buffered / vid.duration) * 100, '%');
}
video{height: 200px;margin-bottom:100vh}
<video id="vid" controls src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm"></video>
我认为以下内容可行。让我知道。
//<!CDATA[
/* js/external.js */
var doc, bod, I; // for use on other loads
addEventListener('load', function(){
doc = document; bod = doc.body;
I = function(id){
return doc.getElementById(id);
}
var vid = I('vid'), prog = I('prog'), loaded = I('loaded'), progI;
vid.onloadedmetadata = function(){
var n = 0, d = this.duration;
progI = setInterval(function(){
if(n < d){
n = 0;
for(var i=0,b=vid.buffered,p,l=b.length; i<l; i++){
n += (b.end(i)-b.start(i))/d;
}
p = Math.round(n*100);
if(p === 100)n = d;
prog.value = p; loaded.innerHTML = p+'%';
}
else{
clearInterval(progI); progI = undefined;
}
}, 500);
}
vid.src = 'https://www.w3schools.com/html/mov_bbb.mp4';
}); // end load
//]]>
/* css/external.css */
*{
box-sizing:border-box; padding:0; margin:0;
}
html,body{
width:100%; height:100%;
}
body{
background:#ccc;
}
#content{
padding:7px; text-align:center;
}
#vid,#prog{
display:block; width:400px; margin:0 auto;
}
#vid{
height:220px;
}
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
<meta charset='UTF-8' /><meta name='viewport' content='width=device-width, height=device-height, initial-scale:1' />
<title>Test Template</title>
<link type='text/css' rel='stylesheet' href='css/external.css' />
<script type='text/javascript' src='js/external.js'></script>
</head>
<body>
<div id='content'>
<video id='vid' type='video/mp4' controls='controls'></video>
<progress id='prog' value='0' max='100'></progress>
<div id='loaded'>0%</div>
</div>
</body>
</html>