Воспроизведение видео 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 и