I'm trying to update the video source and then play it. I am using Videogular2 within an Ionic 2 (Angular 2) app.
I would expect the video source to be changed and upon loading begin playing.
The video source changes successfully (I can see this in Chrome developer tools/DOM) and poster image changes.  The video does not play though.  I am using vg-overlay-play, which when clicked/tapped does not play the video.  If I amend my code to include native controls on video then I can get the video to play by manually using these controls.
<ion-header>
  <ion-navbar>
    <ion-title>{{ selectedClass.name }}</ion-title>
  </ion-navbar>
</ion-header>
<ion-content>
  <vg-player vg-responsive="true" vg-plays-inline="true" (onPlayerReady)="onPlayerReady($event)">
    <vg-overlay-play [vgFor]="singleVideo"></vg-overlay-play>
    <vg-buffering></vg-buffering>
    <vg-controls>
      <vg-time-display [vgFor]="singleVideo" [vgProperty]="'left'" [vgFormat]="'mm:ss'"></vg-time-display>
      <vg-scrub-bar [vgFor]="singleVideo">
            <!-- more components here -->
        </vg-scrub-bar>
    </vg-controls>
    <video [vgMedia]="media" #media 
      id="singleVideo" 
      preload="auto"
      type="video/mp4"
      webkit-playsinline
      playsinline>
      <source *ngFor="let video of sources" [src]="video.src" [type]="video.type">
    </video>
  </vg-player>
</ion-content>
import { Component } from '@angular/core';
import { Content, NavController, NavParams } from 'ionic-angular';
import { VgAPI } from 'videogular2/core';
import { VgCoreModule } from 'videogular2/core';
import { VgControlsModule } from 'videogular2/controls';
import { VgOverlayPlayModule } from 'videogular2/overlay-play';
import { VgBufferingModule } from 'videogular2/buffering';
@Component({
  selector: 'page-class-video',
  templateUrl: 'class_video.html'
})
export class ClassVideoPage {
  selectedClass: any;
  playlist: any;
  currentVideo: any = 0;
  currentVideoURL: any;
  totalVideos: any;
  classEnded: boolean = false;
  api: any;
  sources : Array<Object>;
  constructor() {
    this.selectedClass = navParams.get('class');
    this.playlist = this.selectedClass.videos;
    this.totalVideos = this.selectedClass.videos.length;
    this.sources = new Array<Object>();
    this.sources.push({
      src: this.selectedClass.videos[0].video_s3,
      type: "video/mp4"
    });
  }
  // Load API when video is ready
  onPlayerReady(api: VgAPI) {
    this.api = api;
    // Listen for end of video
    this.api.getDefaultMedia().subscriptions.ended.subscribe(() => {
      this.currentVideo++;
      if(this.currentVideo == this.totalVideos) {
        this.classEnded = true;
      } else {
        this.setCurrentVideo(this.playlist[this.currentVideo].video_s3);
        this.onPlayerReady(this.api);
        this.api.play(); // Rarely works as it fires before video has loaded
      }
    });
    // Play video automatically
    this.api.getDefaultMedia().subscriptions.canPlayThrough.subscribe(() => {
      this.api.play();
    });
    this.api.getDefaultMedia().subscriptions.loadedData.subscribe(() => {
      this.api.play();
    });
  }
  setCurrentVideo(source: string){
    this.sources = new Array<Object>();
    this.sources.push({
      src: source,
      type: "video/mp4"
    });
    this.api.getDefaultMedia().currentTime = 0;
    this.api.play();
  }
}
this.selectedClass.videos is an array of video objects.
I have tried binding to src on the video tag instead of using a sources list, but get the exact same behaviour.
I fixed this by not utilizing the API for playing at all.  Instead I use the native autoplay video tag, which has the video play as soon as it loads, meaning I don't need to try and initiate a play myself.
When doing this the vg-overlay-play functionality works as expected.
I'm unsure why api.play() is causing such pain with the videos.  It's almost as though it's being constantly called, so any press of vg-overlay-play is instantly overruled by api.play().
autoplay fixed this though:
<video [vgMedia]="media" #media 
  id="singleVideo" 
  preload="auto"
  type="video/mp4"
  webkit-playsinline
  playsinline
  autoplay>
  <source *ngFor="let video of sources" [src]="video.src" [type]="video.type">
</video>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With