Safari перезагружает видео в памяти

В Chrome, когда <video> создается с данным <source>, видео загружается один раз, а затем любые впоследствии созданные элементы <video> с тем же<source> используют видео в памяти (как и ожидалось).

В Safari (12.0) новые видео с тем же источником перезагружаются каждый раз, даже если видео уже находится в памяти!

console.info("Loading the first video...");  
createVideo("https://ciliar.co/video/beach.mp4", () => {
  console.info("First video fully loaded!");
  
  console.info("Loading the second video...");
  createVideo("https://ciliar.co/video/beach.mp4", () => {
    console.info("Second video fully loaded!");
  });
});


// Helper to create video elements with a given url and call onFullyLoaded once the video can play through fully.
function createVideo(url, onFullyLoaded) {
  const vid = document.createElement("video");
  vid.setAttribute("preload", "auto");
  vid.oncanplaythrough = onFullyLoaded;

  const source = document.createElement("source"); 
  source.type = "video/mp4";
  source.src = url;
  
  vid.appendChild(source);
  document.body.appendChild(vid);
}

Когда вышеуказанное выполняется в Chrome vs Safari, вы можете увидеть, как второе видео загружается «мгновенно» в Chrome, но повторно загружается и занимает некоторое время в Safari.

Как я могу заставить Safari повторно использовать видео в памяти, когда новый элемент имеет тот же источник, что и предыдущий? Моя конечная цель - предварительно загрузить видео перед его отображением (первым видео будет display: none).

Просто намек: здесь определенно нет никакого "in-memory" материала. Если браузер реализовал повторное использование уже загруженных видеоданных, это произойдет на диске, скорее всего, в каталоге кеша браузера. Возможно, вам придется найти обходной путь и загрузить материал самостоятельно, создать видео-капли или что-то в этом роде ... посмотрите, например, здесь, последние 2-3 сообщения: bugzilla.mozilla.org/show_bug.cgi?id=476371

Harry 18.10.2018 18:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
1
262
1

Ответы 1

Поскольку Apple никоим образом не разрешает разработку Safari, не заплатив им сотни евро / долларов, я не могу это проверить, но:

Как насчет простой передачи кэшированного видеоэлемента

vid.oncanplaythrough = () => {
    document.removeChild(vid); // not really necessary
    onFullyLoaded(vid);
};

а затем используйте этот элемент где-нибудь еще на нужной вам странице.

Единственной альтернативой было бы создать поток в памяти из первого элемента для второго (поскольку он полностью загружен, возможно, даже не потребуется создавать поток), но это, вероятно, удвоит требования к памяти, что было бы нежелательно.

К сожалению, в моем конкретном сценарии с использованием Vue.js видеоэлементы динамически создаются и удаляются в разных местах, и все это контролируется Vue, поэтому я не думаю, что это решение сработает.

abagshaw 17.10.2018 20:29

Другие вопросы по теме