Воспроизведение видео HTML5 на IPad и поиск
очень странная ошибка, которую я не могу понять.
Я пытаюсь получить видео HTML5 для воспроизведения с определенной позиции, когда пользователь нажимает play. Я пытаюсь найти его, когда видео начинает воспроизводиться.
в моем случае играть мне this.currentTime = X
в браузере он работает нормально. Но на IPad, когда я играю видео, Видео не стремится к правильному положению (оно начинается с нуля).
еще более странно, если я делаю this.currentTime = X
вызов в a setTimeout, скажем, 1 секунду, он работает на IPad (иногда).
5 ответов
на iOS, загрузка видео во время игры (см. пункт #2), а не во время загрузки страницы. Я предполагаю, что видео не загружается при запуске this.currentTime = X
, поэтому он не имеет никакого эффекта. Это также объясняет, почему задержка операции иногда может решить проблему: иногда она загружается через секунду, иногда нет.
у меня нет устройства iOS для тестирования, но я бы предложил привязать loadeddata
слушатель видео, так что ваш currentTime
манипуляция происходит только после видео начинает загрузку:
// within the play event handler...
if(!isIOSDevice) {
this.currentTime = X;
} else {
function trackTo(evt) {
evt.target.currentTime = X;
evt.target.removeEventListener("loadeddata", trackTo)
});
this.addEventListener("loadeddata", trackTo);
}
вам нужно установить isIOSDevice
в другом месте вашего кода, на основе того, происходит ли текущий визит с устройства iOS.
хотя этот вопрос довольно старый вопрос остается открытым. Я обнаружил решение, которое работает на нескольких протестированных iPads (1+2+3) для iOS 5 и 6 (iOS3+4 не протестировано):
в основном вам сначала нужно дождаться начального playing
событие, затем добавьте одноразовую привязку для canplaythrough
и затем на progress
- только тогда вы можете фактически изменить currentTime
значение. Любые попытки до этого провалятся!
видео должно начать играть сначала, что делает черный слой на верхняя часть элемента видео довольно удобна. К сожалению, звуки в видео не могут быть деактивированы с помощью JavaScript --> не идеальный UX
// https://github.com/JoernBerkefeld/iOSvideoSeekOnLoad / MIT License
// requires jQuery 1.8+
// seekToInitially (float) : video-time in seconds
function loadingSeek(seekToInitially, callback) {
if("undefined"==typeof callback) {
callback = function() {};
}
var video = $("video"),
video0 = video[0],
isiOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/) !== null,
test;
if(isiOS) { // get the iOS Version
test =navigator.userAgent.match("OS ([0-9]{1})_([0-9]{1})");
// you could add a loading spinner and a black layer onPlay HERE to hide the video as it starts at 0:00 before seeking
// don't add it before or ppl will not click on the play button, thinking the player still needs to load
}
video.one("playing",function() {
if(seekToInitially > 0) {
//log("seekToInitially: "+seekToInitially);
if(isiOS) {
// iOS devices fire an error if currentTime is set before the video started playing
// this will only set the time on the first timeupdate after canplaythrough... everything else fails
video.one("canplaythrough",function() {
video.one("progress",function() {
video0.currentTime = seekToInitially;
video.one("seeked",function() {
// hide the loading spinner and the black layer HERE if you added one before
// optionally execute a callback function once seeking is done
callback();
});
});
});
} else {
// seek directly after play was executed for all other devices
video0.currentTime = seekToInitially;
// optionally execute a callback function once seeking is done
callback();
}
} else {
// seek not necessary
// optionally execute a callback function once seeking is done
callback();
}
});
}
все это можно скачать с мой GitHub РЕПО
apsillers - Это верно. Как только видео начнет воспроизводиться, появится Quicktime-плеер, и видео не будет доступно до тех пор, пока не будет запущено первое событие "прогресс". Если вы попытаетесь искать до этого, вы получите недопустимую ошибку состояния. Вот мой код:
cueVideo = function (video, pos) {
try {
video.currentTime = pos;
// Mobile Safari's quicktime player will error if this doesn't work.
} catch(error) {
if (error.code === 11) { // Invalid State Error
// once 'progress' happens, the video will be seekable.
$(video).one('progress', cueVideo.bind(this, video, pos));
}
}
}
попробуйте ограничить свой X
до 1 decimal
X.toFixed(1);
как вы упомянули, он работает иногда после времени 1 секунды. Вы пытались установить позицию после playing
событие? или, может быть, даже canplaythrough
событие
взгляните на источник на этой странице чтобы просмотреть весь список событий, которые могут быть использованы (в файле JavaScript)
оцените попытки получить ответы ниже. К сожалению, пришлось прибегнуть к простой проверке внутри timeupdate, если currenttime был > 0 и