Запрос элемента видео HTML5 остается навсегда (на хроме)
У меня странная проблема в Chrome.
Каждый раз, когда я загружаю элемент <video>
, хром запускает два запроса HTTP.
Первая из них останется в ожидании навсегда (я предполагаю, что это запрос "метаданные", "частичный контент". Но дело в том, что он остается в ожидании)
Вторая в том же файле в порядке и продолжается и заканчивается после завершения загрузки.
Проблема заключается в том, что первый запрос остается в ожидании, пока я не закрою страницу браузера. Поэтому в какой-то момент, если я загружу несколько видеороликов, Chrome сломается и перестанет загружаться, потому что каждый доступный запрос занят этими ожидающими запросами.
Я создал сокращенный тестовый пример: http://jsbin.com/ixifiq/3
У меня есть проверка, чтобы воспроизвести проблему, и это происходит на Video.js и MediaElements.js frontpages. Откройте вкладку "Сеть" при загрузке страницы, вы увидите первый ожидающий запрос. Затем нажмите воспроизведение на видео, и вы увидите, что второй запрос работает, но первый останется в ожидании навсегда.
Кто-нибудь знает, исправить эту ошибку?
Ответы
Ответ 1
По-видимому, это ошибка из Chrome. И нечего делать с этим банкоматом.
Недавно я сообщил об этой проблеме в проекте Chromium и был назначен. Так что, надеюсь, это будет исправлено в ближайшем будущем.
Отчет об ошибке: https://code.google.com/p/chromium/issues/detail?id=234779
Ответ 2
(Эта ошибка все еще существует в Chrome 38.0.2125.111, OS X 10.10)
Это может быть ошибка Chrome, и вы можете решить ее без какого-либо фиктивного трюка ?time-suffix
, только , помогая быстрее освобождать сокеты Chrome:
У меня была такая же ошибка в HTML-презентации RevealJs, с 20 + видео (по одному на слайд, автозапуск на слайд-фокусе). В качестве побочного эффекта эта проблема с нереализованным сокетом также повлияла на другие медиафайлы, загруженные ajax-lazy, сразу после первого ожидающего/заблокированного видео в том же HTML DOM.
После ответа Уолтера (см. отчет об ошибке), я исправил проблему, следуя следующим шагам:
1- Установите атрибут видео preload
в none
:
<video preload="none">
<source src="video.webM" type="video/webM">
</video>
2 - Используйте обработчик событий canplaythrough
для воспроизведения и/или приостановки видео после его загрузки и готовности. Это позволяет Chrome разблокировать сокет, используемый для загрузки этого видео:
function loadVideos(){
$("video").each(function(index){
$(this).get(0).load();
$(this).get(0).addEventListener("canplaythrough", function(){
this.play();
this.pause();
});
});
}
Ответ 3
Я не знаю, будет ли он функционировать прямо сейчас, но я помню, как решить эту проблему, добавив параметр в URL-адрес видео, как "video.mp4? t = 2123". Конечно, каждый раз, когда вы загружаете видео, параметр должен быть другим. Я бы использовал
var parameter = new Date().getMilliseconds();
чтобы получить его, и добавьте его.
С этим, по крайней мере несколько месяцев назад, я смог воспроизводить одно и то же видео несколько раз без Chrome, ожидая ответа.
Надеюсь, что это поможет.
Ответ 4
Эта ошибка все еще существует. Я использую видеопроигрыватель HTML5 на одностраничном приложении. После загрузки около 7 игроков с предварительной буферизацией я попал в предел и больше не загружаю видео. Я нашел еще один ответ, связанный с изображениями, и я с удивлением обнаружил, что этот ответ решает эту проблему.
if(window.stop !== undefined) {
window.stop();
} else if(document.execCommand !== undefined) {
document.execCommand("Stop", false);
}
ссылка: Javascript: Отменить/Остановить запросы изображения
Ответ 5
Я нашел эту проблему при использовании html5-видео внутри динамического контента, такого как карусели, для освобождения заблокированных сокетов, которые вы должны выгрузить источник видео:
var video = $('#video');
video[0].pause();
video.prop('src','');
video.find('source').remove();
video.remove();
Ошибка утверждает, что она исправлена, но мне все равно пришлось делать это на Chrome 42. По крайней мере, я все же мог установить preload = "auto".
Ответ 6
У нас были те же симптомы, но проблема заключалась в том, что мы дважды вызывали load()
на одно и то же видео: один и тот же видеоконтроль, тот же источник видео (MP4). В инструментальных средствах dev появилось два идентичных 206 запросов, а затем, несколько раз переключив видео, Chrome отменит первый запрос, выключит прогрессивное воспроизведение и дождитесь завершения этого второго запроса.
Также обратите внимание, что если вы используете источник MP4 и не отформатированы для прогрессивного воспроизведения (это означает, что атом MOOV находится в начале файла), тогда у вас будет 1-2 дополнительных запроса для файла, что делает его еще более запутанным.