跨浏览器视频预加载
Cross-browser video preload
我找到了一种在播放前将视频部分预加载到 20% 的方法,这似乎在 Firefox 上运行良好:
window.addEventListener("load", function() {
var video = document.createElement("video");
video.setAttribute("preload", "auto");
video.setAttribute("controls", "true");
var mp4 = document.createElement("source");
mp4.setAttribute("src", "https://archive.org/download/ElephantsDream/ed_1024_512kb.mp4");
mp4.setAttribute("type", "video/mp4");
var webm = document.createElement("source");
webm.setAttribute("src", "https://archive.org/download/ElephantsDream/ed_1024.ogv");
webm.setAttribute("type", "video/ogv");
video.appendChild(mp4);
video.appendChild(webm);
document.body.appendChild(video);
var v = document.querySelector("video");
v.addEventListener("progress", function() {
(function() {
if(v.readyState == 4) {
var buffer = v.buffered;
var loaded = (buffer.end(0) / v.duration) * 100;
console.log(loaded);
if (buffer.length === 1) {
if (loaded >= 20) {
console.log("Vidéo chargée");
v.play(); }
}
}
})();
});
});
不幸的是,在 Chrome 上,必须播放视频才能进行缓冲。
是否有跨浏览器代码来预加载视频?
除非您设置
,否则视频将始终预加载
video.setAttribute("preload", "none");
浏览器之间的差异取决于实现。根据 spec 内资源 获取算法
User agents may decide to not download more content at any time, e.g. after buffering five minutes of a one hour media resource, while waiting for the user to decide whether to play the resource or not, or while waiting for user input in an interactive resource.
因此,不幸的是,由于您设置了 preload=auto,因此您无法控制。 如果您想要交叉浏览,我会使用 属性
video.setAttribute("autoplay", "true|false")
video.setAttribute("preload", "metadata|auto")
关于 preloading on html5 的一些信息。
--更新---
我 post 这里是 Chrome 的最终解决方案,由他通过 pastebin 提供的问题的所有者提供。感谢 jadw
window.addEventListener("load", function() {
var video = document.createElement("video");
video.setAttribute("preload", "auto");
video.setAttribute("controls", "true");
video.setAttribute("webkit-playsinline", "true");
video.setAttribute("playsinline", "true");
video.setAttribute("autoplay", "true");
var mp4 = document.createElement("source");
mp4.setAttribute("src",
"https://www.html5rocks.com/en/tutorials/video/basics/devstories.mp4");
mp4.setAttribute("type", "video/mp4");
video.appendChild(mp4);
video.onloadstart = function() {
video.volume = 0;
video.addEventListener("progress", progressLoad);
video.pause();
};
var progressLoad = function(){
console.log(video.readyState);
(function() {
if (video.readyState === 4) {
var buffer = video.buffered;
var loaded = (buffer.end(0) / video.duration) * 100;
console.log(loaded);
video.currentTime = loaded;
if ((buffer.length === 2) || (loaded >= 20)) {
video.currentTime = 0;
video.removeEventListener("progress", progressLoad);
console.log("Video loaded");
document.body.appendChild(video);
video.play();
}
}
})();
};
});
我找到了一种在播放前将视频部分预加载到 20% 的方法,这似乎在 Firefox 上运行良好:
window.addEventListener("load", function() {
var video = document.createElement("video");
video.setAttribute("preload", "auto");
video.setAttribute("controls", "true");
var mp4 = document.createElement("source");
mp4.setAttribute("src", "https://archive.org/download/ElephantsDream/ed_1024_512kb.mp4");
mp4.setAttribute("type", "video/mp4");
var webm = document.createElement("source");
webm.setAttribute("src", "https://archive.org/download/ElephantsDream/ed_1024.ogv");
webm.setAttribute("type", "video/ogv");
video.appendChild(mp4);
video.appendChild(webm);
document.body.appendChild(video);
var v = document.querySelector("video");
v.addEventListener("progress", function() {
(function() {
if(v.readyState == 4) {
var buffer = v.buffered;
var loaded = (buffer.end(0) / v.duration) * 100;
console.log(loaded);
if (buffer.length === 1) {
if (loaded >= 20) {
console.log("Vidéo chargée");
v.play(); }
}
}
})();
});
});
不幸的是,在 Chrome 上,必须播放视频才能进行缓冲。
是否有跨浏览器代码来预加载视频?
除非您设置
,否则视频将始终预加载video.setAttribute("preload", "none");
浏览器之间的差异取决于实现。根据 spec 内资源 获取算法
User agents may decide to not download more content at any time, e.g. after buffering five minutes of a one hour media resource, while waiting for the user to decide whether to play the resource or not, or while waiting for user input in an interactive resource.
因此,不幸的是,由于您设置了 preload=auto,因此您无法控制。 如果您想要交叉浏览,我会使用 属性
video.setAttribute("autoplay", "true|false")
video.setAttribute("preload", "metadata|auto")
关于 preloading on html5 的一些信息。
--更新---
我 post 这里是 Chrome 的最终解决方案,由他通过 pastebin 提供的问题的所有者提供。感谢 jadw
window.addEventListener("load", function() {
var video = document.createElement("video");
video.setAttribute("preload", "auto");
video.setAttribute("controls", "true");
video.setAttribute("webkit-playsinline", "true");
video.setAttribute("playsinline", "true");
video.setAttribute("autoplay", "true");
var mp4 = document.createElement("source");
mp4.setAttribute("src",
"https://www.html5rocks.com/en/tutorials/video/basics/devstories.mp4");
mp4.setAttribute("type", "video/mp4");
video.appendChild(mp4);
video.onloadstart = function() {
video.volume = 0;
video.addEventListener("progress", progressLoad);
video.pause();
};
var progressLoad = function(){
console.log(video.readyState);
(function() {
if (video.readyState === 4) {
var buffer = video.buffered;
var loaded = (buffer.end(0) / video.duration) * 100;
console.log(loaded);
video.currentTime = loaded;
if ((buffer.length === 2) || (loaded >= 20)) {
video.currentTime = 0;
video.removeEventListener("progress", progressLoad);
console.log("Video loaded");
document.body.appendChild(video);
video.play();
}
}
})();
};
});