Подтвердить что ты не робот

Выбор видеообъекта HTML5 с помощью jQuery

У меня возникают проблемы с получением тега HTML5 с помощью jQuery. Вот мой код:

Код HTML:

<video id="vid" height="400" width="550">
<source src="movie.mp4" type="video/mp4">
<source src="movie.ogv" type="video/ogg">
</video>

Код Javascript:

function playVid(){
    console.log($('#vid'));
    console.log($('#vid')[0]);
    $('#vid')[0].currentTime=5;
    $('#vid')[0].play()
}

$(document).ready(){
    playVid();
}

Код разбивается на строку .currentTime со следующей ошибкой:

InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable

Вот бит, который я не могу вычислить - первый console.log показывает объект, который я ожидал бы, внутри этого объекта находится еще один объект с именем 0, и в нем содержатся все свойства и методы видео HTML5, которые вы ожидаете, включая .currentTime.

Однако, как только я делаю второй журнал $('#vid')[0], он показывает код HTML для тега видео, а не объект, который я получил после вызова 0. Я получаю точные результаты для console.log($('#vid')["0"]) и console.log($('#vid').get(0)).

Есть ли способ получить объект 0 в объекте, возвращаемом $('#vid'), который работает в jQuery?

4b9b3361

Ответ 1

Я думаю, вы пытаетесь взаимодействовать с элементом видео до его готовности.

Попробуйте что-то вроде этого:

function loadStart(event)
{
    video.currentTime = 1.0;
}

function init()
{
    video.addEventListener('loadedmetadata', loadStart, false);
}
document.addEventListener("DOMContentLoaded", init, false);

Источник: HTML5 Видео - Chrome - Настройки ошибок currentTime

Ответ 2

У меня такая же проблема (со звуком). Я не считаю, что принятый ответ разрешает или объясняет проблему вообще, в основном потому, что это не решение jquery.

Непонятно, могу ли я получить свойство currentTime, и я даже могу убедиться, что звук уже был воспроизведен, прежде чем пытаться установить currentTime, и такая же ошибка возникает, поэтому я не верю это имеет какое-либо отношение к тому, что СМИ "готовы".

var a = $("#myaudio").get(0); // a html5 audio element
console.log(a)                // dumps the object reference in the console
console.log(a.currentTime);   // works fine, logs correct value
a.currentTime = 100           // fails with an InvalidStateError

Обходным путем является использование setTimeout

setTimeout(function(){
            a.currentTime = 0;
        },1);

... но я хотел бы понять, почему он терпит неудачу!

Ответ 3

var a_video = $('#video_id');

a_video.on('loadeddata', function() {
  if(a_video.readyState != 0) {
    a_video[0].currentTime = 100;
  } else {
    a_video.on('loadedmetadata', function() {
      a_video[0].currentTime = 100;
    });
  }
});

Ответ 4

function playVid(){
  $('#vid').get(0).currentTime=5;
  $('#vid').get(0).play()
}

$(window).load(function(){
  playVid();
});

Здесь - пример jsfiddle.

Ответ 5

У меня была такая же проблема с аудио. Это катастрофа:). Перед установкой currentTime вам необходимо воспроизвести аудио. Другого пути я не нашел. Вот хороший поток для справки: https://github.com/johndyer/mediaelement/issues/243

Воспроизвести элемент, а затем установить прослушиватель событий для события воспроизведения, который будет устанавливать текущее время. Мне пришлось предотвратить бесконечный цикл, поэтому я устанавливал "loadPlayed" вне метода. Это может быть не изящно, но это то, что работает, поэтому я держу его.

audioplayer.src = source;
audioplayer.play();
audioplayer.addEventListener('playing', function () {
    if (loadPlayed == false)
    {
        audioplayer.currentTime = Time;
        audioplayer.play();
        loadPlayed = true;
    }
    else {
        audioplayer.removeEventListener('playing', this);
    }
}); 

Ответ 6

Вы также можете использовать try - catch, чтобы избежать этой проблемы:

$(document).ready(function() {

    var $video = $('#vid'),
        video = $video[0];

    function playVid() {
        video.currentTime = 5;
        video.play();
    }

    try {
        playVid();
    } catch(error) {
        $video.on('loadedmetadata', playVid);
        video.load();
    }

});

Ответ 7

У меня была аналогичная проблема, но я не могу использовать прослушиватель событий, потому что я работаю с временными кодами и функциями щелчка, чтобы установить текущее время. Но я также нашел рабочее решение. Всякий раз, когда я нажимаю на одну кнопку (каждая кнопка имеет другую переменную времени), это код внутри функции щелчка:

$("#movie").get(0).play();
setTimeout(function () {
     $("#movie").get(0).currentTime = my_time_variable;
}, 500);

Итак, ожидая за 0,5 секунды до запуска функции InvalidStateError больше не будет. Может быть, это быстрое и грязное решение, но оно работает;)