1

I'm attempting to build a utility in angular2 to browse videos on my local desktop. I can successfully load the videos into the html5 video control and play them with the standard built-in controls but I will require custom controls to play,pause,seek, etc... When I call play() or pause() or really do anything related to the video element's events the video element "resets" itself.

Please see the Plunker project that I have created here: https://plnkr.co/edit/Zs4FAdeJz0PXPxn7PSBb?p=preview

Note that this problem only occurs when using a local file. (using the URL.CreateObjectURL(...) method. I've tried various methods using template reference variables and have also tried calling play() from the component class after using the @ViewChild directive. The results are the same - the video simply flashes on the screen and sets the currentTime back to zero.

<div>
  <h1>Local Video Sandbox</h1>
  <input type="file" (change)="onFilesSelected($event)" multiple/>
  <div *ngFor="let file of files" (click)="onSelectFile(file)">
  Select to view: {{file.name}}
  </div>
</div>

<div *ngIf="selectedSrc">
  <video #movie [src]="_domSanitizer.bypassSecurityTrustUrl(selectedSrc)" width="500" controls></video>
  <div>
    <button (click)="movie.play()">Play</button>
    <button (click)="movie.pause()">Pause</button>
  </div>
</div>

export class App {

  constructor(private _domSanitizer: DomSanitizer) {
  } 

  files: FileList;
  selectedSrc: string;

  onFilesSelected(event: any) {
    this.files = event.target.files;
  }

  onSelectFile(file: File) {
    this.selectedSrc = URL.createObjectURL(file);
  }
}

I thought this may be a browser limitation with local files but a quick adaptation of dsbonev's javascript example loading a local file works fine: http://jsfiddle.net/4msbuhng/

<h1>HTML5 local video file player example</h1>
<div id="message"></div>
<input type="file" accept="video/*"/>
<video id="movie" width="400"></video>
<button type="button"
onclick="document.getElementById('movie').pause()">Pause</button>
<button type="button"
onclick="document.getElementById('movie').play()">Play</button>

Any idea what I'm doing wrong?

0

1 Answer 1

1

I was able to get this to work by calling the _domSanitizer in the event handle instead of in the template expression. I'm not exactly sure why that made a difference. Probably something to do with how the video elements properties are modified.

  onSelectFile(file: File) {
    this.selectedSrc = this._domSanitizer.bypassSecurityTrustUrl(URL.createObjectURL(file));
    this.selectedFile = file;
  }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.