Запрос элемента видео 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 дополнительных запроса для файла, что делает его еще более запутанным.