Как запустить несколько видео с помощью ar.js

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ 13.09.2019, 23:50: этот код работает с несколькими настраиваемыми маркерами, однако маркеры не могут быть слишком похожими. Все мои предыдущие пользовательские маркеры были звездочками с небольшими различиями, и я думаю, что это как-то сбивает с толку. Но с новыми, более уникальными маркерами это работает.

Но почему-то это не повлияло на результат при использовании метода «отдельных компонентов».


Обновлено: 13.09.2019: Приведенный ниже код работает с предустановленными маркерами хиро и кандзи и одним настраиваемым маркером. Однако, когда я добавляю несколько пользовательских маркеров, видео останавливается на дополнительных маркерах. Я хочу, чтобы каждый маркер запускал уникальные видео (некоторые видео будут повторно использованы в нескольких маркерах). В моем текущем коде они все запускают оба видео. * Как я могу заставить этот код работать с несколькими пользовательскими маркерами?

<!-- A-FRAME -->
<script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
<script 
src="https://cdn.rawgit.com/jeromeetienne/AR.js/1.6.0/aframe/build/aframe- 
ar.js"></script> 
<script src="https://cdn.rawgit.com/donmccurdy/aframe- 
extras/v4.1.2/dist/aframe-extras.min.js"></script> 
<script src="https://rawgit.com/mayognaise/aframe-gif- 
shader/master/dist/aframe-gif-shader.min.js"></script> 

<!-- jQuery library -->
<script 
 src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"> 
</script> 

<!-- Latest compiled and minified CSS -->
<script 
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"> 
</script> 

<!-- vidhandler component -->
<script>
AFRAME.registerComponent('vidhandler', {
schema: {
  target: {type: 'string'}
},
init: function() {
    this.videoNodes = document.querySelectorAll(this.data.target)
},
tick: function() {
    if (this.el.object3D.visible == true) {
        if (!this.toggle) {
            this.toggle = true;
            for (let i = 0; i < this.videoNodes.length; i++) {
                this.videoNodes[i].play();
            } 
        }
    } else {
        if (this.toggle) {
          for (let i = 0; i < this.videoNodes.length; i++) {
            this.videoNodes[i].pause();
          }
          this.toggle = false;
        }
    }
}
});
</script>

<!-- assets for vidhandler -->
<a-assets >
    <video crossOrigin="Anonymous" Id="vid" 
loop="true"src="assets\textures\alpha.webm">
    </video>
    <video crossOrigin="Anonymous" Id="videonew" loop="true" src="assets\textures\VideoNew.mp4">
    </video>     
</a-assets>

 <!-- marker1: hollywood star 1 -->
 <a-marker  vidhandler="target: #vid, #videonew" type='pattern' url='https://raw.githubusercontent.com/merowell/custom-markers-with-video/master/aframe/examples/assets/hollywood-stars/patt/pattern-hollywood-star1.patt'>
    <!-- add transparent video (.webm) -->
    <a-plane  position='0 .3 0' width='3' height='2' rotation="-90 0 0" material='transparent:true;alphaTest:0;src:#vid'></a-plane>

    <!-- add non transparent video (.mp4) -->
    <a-plane  position='0 .2 0' width='1.5' height='1.5' rotation="-90 0 0" material='src:#videonew'></a-plane>
</a-marker>


<!-- marker2: hollywood star 2 -->
<a-marker  vidhandler="target: #vid, #videonew" type='pattern' url='https://raw.githubusercontent.com/merowell/custom-markers-with-video/master/aframe/examples/assets/hollywood-stars/patt/pattern-hollywood-star2.patt'>
     <!-- add transparent video (.webm) -->
    <a-plane  position='0 .3 0' width='3' height='2' rotation="-90 0 0" material='transparent:true;alphaTest:0;src:#vid'></a-plane>

    <!-- add non transparent video (.mp4) -->
    <a-plane  position='0 .2 0' width='1.5' height='1.5' rotation="-90 0 0" material='src:#videonew'></a-plane>
</a-marker>

Обновлено 9-12-19: как воспроизводить отдельные видео с отдельными маркерами, с возможностью повторного использования определенных видео? С помощью следующего кода видео отображаются как статическое изображение:

<!-- vidhandler component -->
<script>
AFRAME.registerComponent('vidHandler', {
// define a variable in which we will keep the video element
schema: {
 targets: {type: "string"}
},
 init: function() {
    this.toggle = false;
    this.vidNodes = document.querySelectorAll(this.data.targets);
    for (let i = 0; i < this.vidNodes.length; i++) {
          this.vidNodes[i].pause();
    }
},
tick: function() {
    if (this.el.object3D.visible == true) {
        if (!this.toggle) {
            this.toggle = true;
            for (let i = 0; i < this.vidNodes.length; i++) {
              this.vidNodes[i].play();
            }
        }
    } else {
        this.toggle = false;
        for (let i = 0; i < this.vidNodes.length; i++) {
          this.vidNodes[i].pause();
        }
    }
}
});
</script>

Исходный вопрос:

Пожалуйста, простите меня, я новичок в этом ...

Я использую ar.js с aframe для создания опыта webAR. Я использую два разных маркера для запуска двух разных видео.

Как сделать так, чтобы компонент Aframe.register запускал оба моих видео по отдельности? Два видео указаны как активы со следующими идентификаторами: #vid #videonew

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

<!-- Video Player -->
<script>
AFRAME.registerComponent('vidhandler', {
init: function() {
    this.toggle = false;
    this.vidNodes = document.querySelectorAll("#vid, #videonew");
    for (let i = 0; i < this.vidNodes.length; i++) {
          this.vidNodes[i].pause();
    }
},
tick: function() {
    if (this.el.object3D.visible == true) {
        if (!this.toggle) {
            this.toggle = true;
            for (let i = 0; i < this.vidNodes.length; i++) {
              this.vidNodes[i].play();
            }
        }
    } else {
        this.toggle = false;
        for (let i = 0; i < this.vidNodes.length; i++) {
          this.vidNodes[i].pause();
        }
    }
}
});
</script>

<a-assets >
    <video crossOrigin="Anonymous" preload="auto"  Id="vid" loop="true"   webkit-playsinline playsinline controls>
       <source  type="video/webm"  src="assets\textures\alpha.webm">
       <h3>Error : Your browser does not support.</h3>
      <!-- FOR NOTMAL VIDEO YOU CAN USE MP4 or WEBM BUT FOR ALPHA VIDEO YOU NEED TO USE .WEBM FORMAT-->
    </video>

     <video crossOrigin="Anonymous" preload="auto"  Id="videonew" loop="true"   webkit-playsinline playsinline controls>
       <source  type="video/webm"  src="assets\textures\VideoNew.mp4">
       <h3>Error : Your browser does not support.</h3>
      <!-- FOR NOTMAL VIDEO YOU CAN USE MP4 or WEBM BUT FOR ALPHA VIDEO YOU NEED TO USE .WEBM FORMAT-->
    </video>
</a-assets>

person merowell    schedule 10.09.2019    source источник


Ответы (3)


1. Один маркер запускает два видео.

document.querySelectorAll (селектор) возвращает контейнер ( NodeList) с соответствующими элементами. Чтобы вызвать .play() для каждого видео, вам необходимо выполнить итерацию по контейнеру и вызовите его для каждого элемента.


Каждые this.vid.play() и this.vid.pause() необходимо заменить на:

for (let i = 0; i < this.vid.length; i++) {
    this.vid[i].play() // or this.vid[i].pause()
}

Также не помешало бы переименовать в this.videoNodes :)


Посмотрите в этом глюке, как можно запускать два видео с помощью aframe и ar.js

2. Два маркера, каждый с уникальным видео.

Не нужно дублировать компонент для каждого маркера, вам нужна только модификация, которая позволит предоставить видео компоненту. Таким образом, вы можете использовать один и тот же компонент для разных видеоэлементов. Этого можно добиться с помощью компонентов схема.

js - с использованием элемента из схемы

AFRAME.registerComponent('vidHandler', {
  // define a variable in which we will keep the video element
  schema: {
     video: {type: 'selector'},
  },
  init: function() {
     // use the video from the schema
     this.video = this.data.video
     this.video.pause()
  },
  tick: function() {
    if (this.el.object3D.visible == true) {
      if (!this.toggle) {
        this.toggle = true;
        this.video.play()
      }
     } else {
      this.toggle = false;
      this.video.pause()
    }
  }
})

HTML - предоставление элемента компоненту

<a-assets>
   <video id="one">
   <video id="two">
</a-assets>
<a-marker preset="hiro" vidhandler="video: #one">
    <a-box material='src: #one'></a-box>
</a-marker>
<a-marker preset="kanji" vidhandler="video: #two">
    <a-box material='src: #two'></a-box>
</a-marker>   

3. Два маркера запускают любое количество видео.

К настоящему времени мы предоставляем селектор для компонента, но мы также можем предоставить строку для загрузки метода document.querySelectorAll():

// <a-marker videohandler="videos: #one, #two">
// videohandler insides:
schema: {
  videos: {type: 'string'}
},
init: function() {
    this.videoNodes = document.querySelectorAll(this.data.target)
},
// the rest like in the first case

Хотя здесь есть некоторые проблемы.

  • Убедитесь, что вы ставите видео на паузу только после потери маркера. В противном случае один компонент будет приостанавливать воспроизведение видео на каждом тике.
  • Если вы хотите воспроизвести видео с начала на другом маркере, вам нужно будет кэшировать метку времени после потери маркера.

Рабочий сбой здесь.

person Piotr Adam Milewski    schedule 10.09.2019
comment
Я исправил компонент с вашими предложениями, но все равно получаю тот же результат. Работает только #vid, а #videonew - просто статичное изображение. Мне нужно исследовать, как перебирать контейнер, как вы сказали - я действительно не знаю, что это значит. Извини, что я такой новичок! Вне буквальной замены this.vid.play/pause () на for (let i = 0; i ‹this.vid.length; i ++) {this.vid [i] .play () // или this.vid [ i] .pause ()} .... что еще я должен был сделать? - person merowell; 10.09.2019
comment
Я не могу сделать пример atm ar.js (сделаю позже), но проверьте это. Нажатие пробела воспроизводит видео, отпускание ставит их на паузу. - person Piotr Adam Milewski; 10.09.2019
comment
Петр, извините за все комментарии, у меня все работает нормально, также с прозрачностью. Но по какой-то причине это работает только для одного маркера. Я могу поместить два видео в один маркер, и они оба работают. Но мне нужны два маркера с двумя отдельными видео. - person merowell; 11.09.2019
comment
ваш скорректированный код отлично подходит для воспроизведения отдельных видео с двумя разными маркерами. Но если бы я хотел сказать, что хиро играет #one, а кандзи играет #one и #two, нужно ли мне создавать отдельные компоненты? - person merowell; 12.09.2019
comment
@merowell как сейчас? Насколько понятен ответ со всей этой информацией? - person Piotr Adam Milewski; 12.09.2019
comment
видео теперь отображаются как белый самолет. Я обновил свой исходный пост кодом, который у меня есть для компонента vidhandler. Вам это кажется правильным? - person merowell; 13.09.2019
comment
@merowell, я добавил обновление, дайте мне знать, если это то, что вы ищете - person Piotr Adam Milewski; 13.09.2019
comment
большое спасибо! Я очень ценю ваше терпение - мне еще предстоит многому научиться. Вы правите! Я полагаю, что ваши вдумчивые ответы помогут другим, кто решил, что вы можете создать webAR с 10 строками HTML-приманки. ха-ха :) - person merowell; 13.09.2019
comment
Аххх @piotr Я думал, что все работает гладко, но кажется, что когда я удаляю первый маркер с веб-камеры, следующий маркер зависает на видео, где он остановился. Может быть, добавление отметки времени поможет? Заставить его играть с самого начала. Как я могу это сделать? Или, возможно, у вас есть другое представление о том, что может быть причиной этого. - person merowell; 14.09.2019
comment
Я публикую свой самый последний код. Я думаю, это может быть связано с тем, что я использую прозрачные видео, например, Aframe v 0.8? Поскольку ваш пример работает безупречно, но когда я применяю его к своим ресурсам, видео останавливаются. - person merowell; 14.09.2019
comment
хорошо, после устранения неполадок я понял, что когда я заменяю свои пользовательские маркеры предустановленными маркерами хиро / кандзи, это работает. Есть мысли о том, почему это не работает с пользовательскими маркерами? - person merowell; 14.09.2019
comment
Хорошо, @piotr, я понял, что мои пользовательские маркеры выглядят слишком похожими, и поэтому несколько пользовательских маркеров сбивали его с толку. Еще раз спасибо за вашу помощь! - person merowell; 14.09.2019

@Piotr ответил на этот вопрос и предоставил отличный пример с этим глюк: https://glitch.com/edit/#!/stack-57863016?path=arjs.html:3:0

Спасибо! Кроме того, где я терпел неудачу, я не включал vidhandler в раздел a-marker.

person merowell    schedule 11.09.2019

Наконец-то! Я понял --- Чтобы воспроизводить отдельные видео с отдельными маркерами, мне нужно было создать второй компонент. Каждому маркеру нужен уникальный обработчик компонентов, по крайней мере, так я получил его.

person merowell    schedule 11.09.2019
comment
Нет необходимости дублировать компонент, ознакомьтесь с моим обновленным anwser - person Piotr Adam Milewski; 11.09.2019