Создание видеоплеера Angular с помощью Videogular

Опубликовано: 2022-03-11
Проект Videogular поддерживается Toptal Open Source Grants. Toptal Open Source Grants поддерживает членов сети Toptal, занимающихся проектами с открытым исходным кодом.

Как один из первых получателей грантов Open Source, Рауль Хименес Эррандо добавляет новые функции, исправляет ошибки и пишет документацию для проекта Videogular. Чтобы узнать больше о грантах Toptal Open Source, напишите по адресу [email protected].

Согласно статистике онлайн-трафика, видео захватывает контроль над сетью. Старое доброе телевидение умирает, и компании быстро стремятся доминировать на рынке, на который к 2019 году будет приходиться 80% онлайн-трафика.

Многие медиа-провайдеры и продукты полагаются на поддержку видео HTML5:

  • Youtube: платформа для обмена видео и социальными сетями в формате HTML5
  • Netflix: поставщик видеоконтента HTML5
  • JWPlayer: видеосервис HTML5 и провайдер потоковой передачи
  • Brightcove: видеосервис HTML5 и провайдер потоковой передачи
  • Kaltura: видеосервис HTML5 и провайдер потоковой передачи
  • Video.js: видеопроигрыватель HTML5
  • Flowplayer: видеопроигрыватель HTML5 и потоковый провайдер.

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

Что такое Видеогулар?

Как следует из названия, Videogular — это медиа-фреймворк, написанный на Angular 2+. С Videogular вы можете воспроизводить видео, аудио или любой другой контент в формате HTML5. Есть реализация для Angular 1.X (он же AngularJS), но в этой статье речь пойдет только о текущей версии Angular 2+.

Итак, следующий вопрос, который, вероятно, приходит вам в голову: зачем использовать Angular для видео?

Иллюстрация на обложке: Создание видеоплеера Angular

Ну, есть ряд веских причин для выбора конкретного фреймворка для создания видеотеки.

  • Простота участия: поскольку Videogular основан на Angular, популярном фреймворке с очень активным сообществом, другим людям очень легко начать вносить свой вклад, создавая плагины или исправляя ошибки.
  • Веб-компоненты: не нужно писать JavaScript для создания и оформления собственного проигрывателя. Вы можете писать код HTML и CSS.
  • TypeScript: Angular — это типизированный фреймворк, как и все библиотеки вокруг него. Наличие строго типизированной экосистемы позволяет нам обнаруживать ошибки и проблемы с архитектурой, пока не стало слишком поздно.
  • Скорость: все последние популярные фреймворки молниеносно работают, включая Angular.

Кроме того, у нас есть несколько других интересных функций, таких как RxJS, AOT (упреждающая компиляция), Angular CLI и другие.

Как работает Видеогулар?

Мне нравится говорить, что Videogular — это скорее медиа-фреймворк, чем просто видеоплеер HTML5. Наиболее важной особенностью и отличием других видеоплееров является то, что вы пишете теги для настройки вашего плеера вместо JavaScript.

Вот как сейчас работает большинство видеоплееров:

 <video class="library" controls preload="auto" data-config="some-js-object-here"> <source src="video-url.mp4" type='video/mp4'> </video> <script src="video-library.js"></script>

А вот как выглядит реализация Videogular:

 <vg-player> <vg-overlay-play></vg-overlay-play> <vg-buffering></vg-buffering> <vg-controls> <vg-play-pause></vg-play-pause> <vg-time-display vgProperty="current" vgFormat="mm:ss"></vg-time-display> <vg-scrub-bar> <vg-scrub-bar-current-time></vg-scrub-bar-current-time> <vg-scrub-bar-buffering-time></vg-scrub-bar-buffering-time> </vg-scrub-bar> <vg-time-display vgProperty="total" vgFormat="mm:ss"></vg-time-display> <vg-track-selector></vg-track-selector> <vg-mute></vg-mute> <vg-volume></vg-volume> <vg-fullscreen></vg-fullscreen> </vg-controls> <video #myMedia [vgMedia]="myMedia" preload="auto" crossorigin> <source src="video-url.mp4" type='video/mp4'> <track kind="subtitles" label="English" src="assets/subs/pale-blue-dot.vtt" srclang="en" default> <track kind="subtitles" label="Espanol" src="assets/subs/pale-blue-dot-es.vtt" srclang="es"> </video> </vg-player>

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

Но это не единственное преимущество, которым мы можем воспользоваться при создании видеоплеера Angular. Подумайте о больших командах разработчиков, в которых дизайнеры HTML/CSS и разработчики JavaScript работают вместе над одним кодом. Поскольку мы используем пользовательские элементы, дизайнеры могут начать работу, применяя стили и анимацию, без необходимости изучения новой библиотеки или даже JavaScript/TypeScript.

Кроме того, Videogular предоставляет гораздо более мощные возможности, чем просто написание простого видеоплеера на Angular, такие как автоматическая синхронизация между несколькими медиафайлами или возможность воспроизводить не только видео/аудио, но практически любой контент, у которого есть начало и конец.

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

Как установить Видеогулар

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

Весь код доступен в нашем репозитории Videogular Showroom GitHub и опубликован на странице GitHub.

Установка Videogular должна быть простой задачей для любого опытного разработчика Angular. С другой стороны, если вы только начинаете работать с Angular, вам следует ознакомиться с этим кратким руководством по созданию вашего первого приложения Angular.

Если вы еще не установили Node.js, перейдите на официальный сайт Node.js и установите его. Это единственный сервер, который нам нужно разрабатывать с помощью Angular, и он нужен нам для установки зависимостей через NPM. Вам просто нужно обязательно установить Node.js 6.9.0 или выше и NPM 3.0.0 или выше.

Первое, что нам нужно сделать, это установить Angular CLI. Angular CLI — это обязательный инструмент для любого разработчика Angular, поскольку он обеспечивает простоту создания шаблонов, тестирования, серверов разработки и производственных сборок. Что еще более важно, он следует соглашению, которое может понять любой другой разработчик Angular.

Установите Angular CLI глобально через NPM:

 npm install -g @angular/cli

И давайте создадим наш первый проект с поддержкой SASS:

 ng new smart-video-playlist --style=scss

Это должно создать образец проекта для вас. Если вы хотите начать разработку и одновременно наблюдать за результатами, вы можете запустить npm run start и открыть [http://localhost:4200](http://localhost:4200) . Angular CLI будет запускать сервер разработки Node.js с перезагрузкой в ​​реальном времени и всеми интересными функциями, которые мы, как разработчики, любим.

Теперь вы можете установить библиотеку videogular2 и типизацию core-js :

 npm install videogular2 --save npm install @types/core-js --save-dev

Создание видеоплеера Angular

Если вы хотите, вы можете использовать официальный шрифт Videogular для установки значков на кнопки и элементы управления. Для этого вам нужно добавить CSS в файл .angular-cli.json , доступный в корне вашего проекта.

 { ... "apps": [ { ... "styles": [ "../node_modules/videogular2/fonts/videogular.css", "styles.scss" ], ... } ], ... }

Если вы хотите установить свой собственный шрифт и стили, вы можете установить свой собственный CSS здесь или внутри styles.scss .

Чтобы начать использовать Videogular в своем проекте, вам необходимо добавить модуль Videogular в модуль вашего приложения.

Откройте src/app/app.module.ts и удалите FormsModule и HttpModule; они нам не понадобятся для этой демонстрации. Вот как должен выглядеть ваш файл app.module.ts :

 import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { VgCoreModule } from 'videogular2/core'; import { VgControlsModule } from 'videogular2/controls'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, VgCoreModule, VgControlsModule ], providers: [], bootstrap: [ AppComponent ] }) export class AppModule { }

Когда все настроено, нам просто нужно написать наш HTML-код!

 <vg-player> <vg-controls> <vg-play-pause></vg-play-pause> <vg-playback-button></vg-playback-button> <vg-time-display vgProperty="current" vgFormat="mm:ss"></vg-time-display> <vg-scrub-bar> <vg-scrub-bar-current-time></vg-scrub-bar-current-time> <vg-scrub-bar-buffering-time></vg-scrub-bar-buffering-time> </vg-scrub-bar> <vg-time-display vgProperty="total" vgFormat="mm:ss"></vg-time-display> <vg-mute></vg-mute> <vg-volume></vg-volume> <vg-fullscreen></vg-fullscreen> </vg-controls> <video #media [vgMedia]="media" preload="auto" crossorigin> <source src="http://static.videogular.com/assets/videos/videogular.mp4" type="video/mp4"> </video> </vg-player>

Теперь вы можете запустить сервер и наслаждаться своим первым видеоприложением на базе Angular и Videogular.

 npm run start

Создание списка воспроизведения мультимедиа в Angular

Чтобы перечислить наши видео, мы создадим простой массив со всеми параметрами. Просто имейте в виду, что вы можете загрузить этот список через службу REST с HttpModule Angular, но для простоты мы сделаем это жестко запрограммированным в этой демонстрации.

Откройте app.component.ts и добавьте этот массив видео и его интерфейс:

 import { Component } from '@angular/core'; export interface IMedia { title: string; src: string; type: string; } @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: [ './app.component.scss' ] }) export class AppComponent { playlist: Array<IMedia> = [ { title: 'Pale Blue Dot', src: 'http://static.videogular.com/assets/videos/videogular.mp4', type: 'video/mp4' }, { title: 'Big Buck Bunny', src: 'http://static.videogular.com/assets/videos/big_buck_bunny_720p_h264.mov', type: 'video/mp4' }, { title: 'Elephants Dream', src: 'http://static.videogular.com/assets/videos/elephants-dream.mp4', type: 'video/mp4' } ]; }

Теперь мы готовы добавить список воспроизведения под нашим плеером в файл HTML:

 <ul> <li *ngFor="let item of playlist; let $index = index" (click)="onClickPlaylistItem(item, $index)" [class.selected]="item === currentItem"> {{ item.title }} </li> </ul>

Давайте добавим несколько стилей для selected класса и эффекта hover :

 ul { list-style-type: none; margin: 0; padding: 0; font-family: sans-serif; li { padding: 10px; cursor: pointer; &.selected { background-color: #dddddd; } &:hover { background-color: #cce6ee; } } }

Метод onClickPlaylistItem настроит воспроизведение мультимедиа на нашем проигрывателе Videogular. Теперь перейдем к app.component.ts , чтобы добавить метод:

 // ... export class AppComponent { // ... currentIndex = 0; currentItem: IMedia = this.playlist[ this.currentIndex ]; onClickPlaylistItem(item: IMedia) { this.currentIndex = index; this.currentItem = item; } }

Свойство currentIndex будет использоваться позже для идентификации текущего элемента и его позиции в списке воспроизведения. Это важно для создания списков воспроизведения с бесконечным циклом и обновления currentIndex , когда пользователь щелкает элемент списка воспроизведения.

Наконец, нам нужно только изменить элемент video , чтобы установить источник из свойства currentItem , обрабатываемого списком воспроизведения. Для этого мы создадим простую привязку к свойству src HTML5:

 <video #media [vgMedia]="media" [src]="currentItem.src" preload="auto" crossorigin> </video>

Теперь мы можем протестировать наш плейлист и посмотреть, как он работает. Первое видео загружается в начале, и мы можем переключаться между видео, так что все в порядке! Но мы можем внести некоторые изменения и улучшить опыт, автоматически переключаясь между видео, когда видео завершено, и добавляя лучшее общее управление состоянием проигрывателя.

Для этого нам понадобится Videogular API, глобальная служба, доступная на каждом экземпляре Videogular для обработки состояния и прослушивания событий.

Использование VgAPI для обработки состояний

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

Videogular предоставляет API для контроля и прослушивания изменений для каждого экземпляра VgMedia внутри компонента VgPlayer . На самом деле, все модули Videogular основаны на этом общедоступном API, поэтому вы можете создавать свои собственные модули для своих клиентов или вносить свой вклад в сообщество, выпуская их с открытым исходным кодом.

Чтобы использовать API Videogular, вам просто нужно прослушать событие onPlayerReady , запускаемое компонентом VgPlayer:

 <vg-player (onPlayerReady)="onPlayerReady($event)"> // ...

Когда проигрыватель инициализирован, вы можете сохранить API и начать слушать события, отправляемые тегом video :

 export class AppComponent { // ... onPlayerReady(api: VgAPI) { this.api = api; } }

API Videogular основан на RxJS, так что вы можете subscribe на Observables и реагировать соответственно. Чтобы автоматически воспроизвести видео, нам нужно прослушать событие loadedmetadata .

Давайте добавим новую Subscription для воспроизведения видео при загрузке метаданных:

 export class AppComponent { // ... onPlayerReady(api: VgAPI) { this.api = api; this.api.getDefaultMedia().subscriptions.loadedMetadata.subscribe( this.playVideo.bind(this) ); } playVideo() { this.api.play(); } // ... }

Это было легко; мы просто воспроизводим видео через VgAPI, когда запускается наблюдаемый loadedMetadata .

Вы помните свойство currentIndex ? Сейчас самое время использовать его, чтобы мы могли перейти к следующему видео, когда текущее видео будет завершено:

 // ... export class AppComponent { // ... onPlayerReady(api: VgAPI) { this.api = api; this.api.getDefaultMedia().subscriptions.loadedMetadata.subscribe( this.playVideo.bind(this) ); this.api.getDefaultMedia().subscriptions.ended.subscribe( this.nextVideo.bind(this) ); } nextVideo() { this.currentIndex++; if (this.currentIndex === this.playlist.length) { this.currentIndex = 0; } this.currentItem = this.playlist[ this.currentIndex ]; } // ... }

С помощью этого метода мы можем обрабатывать момент, когда ended событие запускается тегом video , а затем переходить к следующему видео. Мы также добавили небольшой элемент управления для выполнения бесконечного цикла при достижении конца плейлиста, установив currentIndex = 0; так что мы можем вернуться к первому пункту. Наконец, мы устанавливаем currentItem , который будет обновлять наши привязки Angular в пользовательском интерфейсе.

Как видите, здесь мы не проигрываем видео; это потому, что мы обрабатываем это с помощью наблюдаемого loadedMetadata . Когда мы обновляем currentItem внутри nextVideo() , загружается новое видео, и это запускает наблюдаемый loadedMetadata .

Это делает наш код более легким для чтения и трудным для взлома! Наблюдаемые — это круто, верно?

Что дальше?

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

В этой демонстрации мы только поверхностно рассмотрели возможности Videogular. API может управлять несколькими медиафайлами одновременно, у нас есть модули для потоковой передачи и рекламы, и вы даже можете создать медиаплеер для воспроизведения анимации, маршрутов на карте и многого другого.

Videogular выпущен под лицензией MIT и является проектом с открытым исходным кодом, доступным на GitHub. Каждый может создать запрос на вытягивание, представить проблему, написать документацию и внести свой вклад в сообщество.