Частичное решение
Нашел себе обходной путь, который неплохо работает, если видео небольшого размера - в моем случае все видео размером менее 3 МБ.
Хитрость в том, чтобы использовать js fetch API для загрузки полного видео , а затем транслировать его в тег видео.
const videoRequest = fetch("/path/to/video.mp4")
.then(response => response.blob());
videoRequest.then(blob => {
video.src = window.URL.createObjectURL(blob);
});
В отличие от атрибута video src, API извлечения будет получать видеоданные из кэша, если такое же видео уже было извлечено ранее.
Здесь демонстрационная версия codepen , которую можно протестировать в настольном / мобильном Safari (если НЕ в частном режиме).
Pro : видео теперь извлекается из кэша в Safari!
Con : Вы не можете запустить видео, пока не будут загружены полные данные. Вот почему это решение можно использовать только для небольших видео (например, <5 МБ), иначе ваши пользователи могут подождать некоторое время, прежде чем смогут воспроизвести видео. </p>