Ответ 1
Печально Chrome - как и другие браузеры HTML5 - пытается быть уверенным в том, что он загружает и избегает ненужного использования полосы пропускания... это означает, что иногда у нас остается неоптимальный опыт (по иронии судьбы, YouTube страдает от этого настолько, что есть расширения, чтобы усилить предварительную буферизацию!)
Тем не менее, я не нашел, что это требуется слишком часто с хорошим сервером и хорошим соединением, но если вам что-то нужно, единственное решение, которое я нашел, - это кувалда... использовать Ajax для загрузки файл, который вы хотите воспроизвести, а затем загрузить его в источник для элемента видео.
В приведенном ниже примере предполагается, что ваш браузер поддерживает m4v/mp4 - вы, вероятно, захотите использовать тест canPlayType, чтобы выбрать наиболее подходящий формат видео для своих пользователей, если вы не можете гарантировать (например, Chrome). Вы также захотите проверить, насколько хорошо он обрабатывает видео размера, который вы хотите (я пробовал некоторые довольно большие, но не уверен, какой верхний предел это будет надежно обрабатывать)
Образец также довольно прост... он запускает запрос и не передает ничего пользователю, пока он загружается - с вашим размером видео вы, вероятно, захотите показать индикатор выполнения, чтобы сохранить их интересно...
другой недостаток этого процесса заключается в том, что он не начнет воспроизводиться до тех пор, пока вы не полностью загрузите файл - если вы хотите глубже отобразить видео динамически из своего буфера, вам нужно будет начать вникать в (в настоящий момент) мир MediaSource
, как описано в сообщениях, таких как http://francisshanahan.com/index.php/2013/build-an-mpeg-dash-player-from-scratch/
<!DOCTYPE html>
<html>
<head>
<title>Preload video via AJAX</title>
</head>
<body>
<script>
console.log("Downloading video...hellip;Please wait...")
var xhr = new XMLHttpRequest();
xhr.open('GET', 'BigBuck.m4v', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
if (this.status == 200) {
console.log("got it");
var myBlob = this.response;
var vid = (window.webkitURL || window.URL).createObjectURL(myBlob);
// myBlob is now the blob that the object URL pointed to.
var video = document.getElementById("video");
console.log("Loading video into element");
video.src = vid;
// not needed if autoplay is set for the video element
// video.play()
}
}
xhr.send();
</script>
<video id="video" controls autoplay></video>
</body>
</html>