0

Существует тег видео HTML. Я хочу знать, когда он начнет играть:Как узнать, что вызывает запуск html-видео?

  • Это вызвано autoplay?
  • Это вызвано вызовом play() в JavaScript?
  • Является ли это причиной нажатия пользователем кнопки воспроизведения?

Я хочу иметь дело с игрой событием вызвал только действия пользователя (третий случай в этих три).

Мое текущее решение:

function videoEventHandler(ev) { 
    var videoElem = ev.target; 
    if (!videoElem.controls) { 
     // no controls in video, means events can't be caused by user actions 
     return true; 
    } 

    switch (ev.type) { 
     case 'play': 
      if (videoElem.autoplay && !videoElem.hasPaused) { 
       // first play event in autoplay video, muse be caused by autoplay 
       return true; 
      } 
      // deal with play event caused by user actions 
      return true; 

     case 'pause': 
      ev.target.hasPaused = true; 
      // deal with pause event caused by user actions 
      return true; 
    } 
} 

Проблема: Мое решение не может справиться с этими сценариями:

  • Он не знает, если событиеигра вызвана вызовом JavaScript для play()
  • Он не знает, произошло ли событие приостановки , вызванное видео достигает конца

Пожалуйста, обратите внимание: я не могу добавить флаг на play(), потому что это называется на веб-странице. Веб-страница не написана мной, и я не могу ее изменить. (Я пишу расширение Chrome)

Может ли кто-нибудь помочь мне в этом?

Это очень конкретный вопрос, это может смутить кого-то. Если мой вопрос смущает вас, оставьте комментарий, и я попытаюсь объяснить его более четко. Оценил.

+0

Что делать, если сайт предоставляет собственную кнопку воспроизведения отдельно от видеоэлемента? Это действие пользователя в основном, даже несмотря на то, что видео запускается с помощью кода play(). – wOxxOm

+0

@wOxxOm Вы правы. Кажется, что не существует идеального решения для каждого сценария. Я просто хочу охватить большинство случаев. –

ответ

0

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

Лучшее решение, которое я получил (не идеально):

function videoEventHandler(ev) { 
    var videoElem = ev.target; 
    if (!videoElem.controls) { 
     // no controls in video, means events can't be caused by user actions 
     return true; 
    } 

    switch (ev.type) { 
     case 'play': 
      if (videoElem.autoplay && !videoElem.hasPaused) { 
       // first play event in autoplay video, muse be caused by autoplay 
       return true; 
      } 
      // deal with play event caused by user actions 
      return true; 

     case 'pause': 
      ev.target.hasPaused = true; 
      var self = this; 
      Util.setTimeout(function() { 
       // we don't record pause event followed by ended, because it is caused by video reaches end 
       if (!videoElem.hasEnded) { 
        // deal with pause event caused by user actions 
       } 
       videoElem.hasEnded = false; 
      }, 50); 
      return true; 
     case 'ended': 
      videoElem.hasEnded = true; 
      return true; 
    } 
} 

Пожалуйста, обратите внимание: этот ответ не является совершенным. Он не знает разницы между игровым событием, вызванным autoplay и по телефону play() в JavaScript.

0

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

Перед вызова игры:

video.playedFromJavascript=true; 
video.play(); 

В игровом слушателе:

if (videoElem.playedFromJavascript==true) { 
       // play event caused by javascript 
videoElem.playedFromJavascript=false; // resetting it to false once captured 
     } 

Мы ended события, которое срабатывает, когда видео, достигнутой end.Use этого событие, чтобы знать, если событие паузы вызвано видео доходит до конца.

+0

Извините, я забыл сказать, что веб-страница не написана мной, и я не могу ее изменить. (Я пишу расширение Chrome) –

1

Вы можете попытаться скрыть элементы управления по умолчанию и создать свои собственные. Таким образом вы получите информацию о действиях пользователя только.

Насколько я знаю, что нет никакой разницы между нажатием кнопки воспроизведения пользователем и видео начинает играть из-за AutoPlay флага установлен в истинную.

Как HTML5 specification говорит:

Атрибут автозапуска является логическим атрибутом. Когда присутствует, агент пользователя автоматически начнет воспроизведение медиа-ресурса, как только , поскольку он может сделать это без остановки.

Пожалуйста, имейте в виду, что если соединение медленное пользователь может нажать воспроизведения кнопку перед воспроизведение начнется из-за автовоспроизведение флаг.

Чтобы выяснить конец воспроизведения вы можете использовать ended событие или попытаться проверить позицию воспроизведения (длительности и CURRENTTIME атрибуты).