Highly configurable, performant and easy-to-use Angular component library for video playback and streaming.
π¦ Signal based components - Granular and optimized render updates
β‘ Zoneless - Built for zoneless Angular applications by default
π§© Standalone architecture β No NgModules required; simpler imports, better tree-shaking, and improved DX
π High performance β Powered by RxJS; change detection runs only when needed (no zone pollution)
π¨ Highly customizable β 200+ CSS variables, custom icons, and fonts. Bring your own assets
βΏ ARIA compliant β All components follow ARIA standards and support custom inputs
π Multilanguage support β Configurable text inputs for full localization
π± Responsive design - Works across all screen sizes and devices
βοΈ Settings panel β YouTube-style navigable settings menu with sub-menus
β¨οΈ Keyboard shortcuts overlay β Press ? to show all shortcuts, auto-integrated
πΎ Configuration storage β Persist user preferences (volume, speed, loop, cinema mode) to localStorage
π¬ Cinema mode β Dim the page and focus on the video
πΌοΈ Thumbnail preview β Hover the scrub bar to see video frame thumbnails via VTT sprite sheets
πΊ Remote playback β Cast to ChromeCast or AirPlay with one click, auto-hides when no devices available
Example project can be found on Stackblitz
EzVidAng updates and develops the library for the 2 latest versions.
| EzVidAng | Angular | Node.js |
|---|---|---|
| ^21.2.x | ^21.2.x | According to Angular docs |
| ^22.0.x | ^22.0.x | According to Angular docs |
| ^22.1.x | ^22.1.x | According to Angular docs |
| ^22.2.x | ^22.2.x | According to Angular docs |
Install the package:
npm i ez-vid-ang
Add the required styles to your angular.json:
{
"projects": {
"your_project": {
"architect": {
"build": {
"options": {
"styles": [
"node_modules/ez-vid-ang/assets/eva-required-import.scss"
]
}
}
}
}
}
}
Register the built-in icons once in your main.ts (or any bootstrapping code that runs before your components render):
import { addEvaIcons } from "ez-vid-ang";
import { evaAllIcons } from "ez-vid-ang/icons";
addEvaIcons(evaAllIcons);To minimize bundle size, import only the icons your components use:
import { addEvaIcons } from "ez-vid-ang";
import { evaPlayIcon, evaPauseIcon, evaFullscreenIcon, evaFullscreenExitIcon } from "ez-vid-ang/icons";
addEvaIcons({ evaPlayIcon, evaPauseIcon, evaFullscreenIcon, evaFullscreenExitIcon });Important
If you want to use HLS streaming directive you must install latest version of the hls.js.
npm i hls.js
And add the required script to your angular.json
{
"projects": {
"your_project": {
"architect": {
"build": {
"options": {
"scripts": [
"node_modules/hls.js/dist/hls.min.js"
]
}
}
}
}
}
}
Important
If you want to use DASH streaming directive you must install v5 of the dash.js.
npm i dashjs
And add the required script to your angular.json
{
"projects": {
"your_project": {
"architect": {
"build": {
"options": {
"scripts": [
"node_modules/dashjs/dist/modern/esm/dash.all.min.js"
]
}
}
}
}
}
}
Import only the components you need β every component is standalone and tree-shakable:
import { Component, signal } from "@angular/core";
import {
EvaBuffering,
EvaControlsContainer,
EvaControlsDivider,
EvaFullscreen,
EvaMute,
EvaOverlayPlay,
EvaPlayer,
EvaPlayPause,
EvaScrubBar,
EvaScrubBarBufferingTime,
EvaScrubBarCurrentTime,
EvaTimeDisplay,
EvaUserInteractionEventsDirective,
EvaVideoSource,
EvaVolume,
} from "ez-vid-ang";
@Component({
selector: "app-player",
templateUrl: "./player.html",
styleUrl: "./player.scss",
imports: [
EvaBuffering,
EvaControlsContainer,
EvaControlsDivider,
EvaFullscreen,
EvaMute,
EvaOverlayPlay,
EvaPlayer,
EvaPlayPause,
EvaScrubBar,
EvaScrubBarBufferingTime,
EvaScrubBarCurrentTime,
EvaTimeDisplay,
EvaUserInteractionEventsDirective,
EvaVolume,
],
})
export class PlayerComponent {
protected readonly sources = signal<EvaVideoSource[]>([{ type: "video/mp4", src: "/video.mp4" }]);
}See Simple Example and Full-Featured Example for complete usage.
Library has four groups of components. Click on the name to go to the documentation:
- EvaCore β Main player component, icon registry, directives (keyboard shortcuts, configuration storage), and providers
- EvaControls β Video control components (play/pause, volume, scrub bar, fullscreen, playback speed, quality selector, track selector, loop, picture-in-picture, download, screenshot, context menu, settings panel, keyboard shortcuts overlay, cinema mode, error overlay, chapter list, and more)
- EvaBuffering β Loading and buffering indicators
- EvaStreaming β Directives for HLS and DASH live streaming support
There are few functionalities I want to implement that are work in progress:
- Audio selection - Select audio track for the video
- A/B loop - Let users set loop start/end points on the scrub bar for segment replay. Useful for music/education.
- Double tap forward/backward - Double-tap left/right halves of the video to seek backward/forward. Standard mobile UX (YouTube, Netflix).
The project uses a strict ESLint configuration with type-aware TypeScript rules and Angular-specific template rules. All available rule presets are enabled.
npm run lint # Check for errors
npx ng lint --fix # Auto-fix fixable errorsAll magic numbers are centralized in src/lib/constants.ts. See linting documentation and constants documentation for details.
The project uses Prettier for code formatting, kept conflict-free with ESLint via eslint-config-prettier.
npm run format # Format all files
npm run format:check # Check formatting without writing changesInstall the recommended esbenp.prettier-vscode VS Code extension for format-on-save. See formatting documentation for details.
If you wish to make a donation you can click the widget.
Your support helps:
- Maintain the project
- Add new features
- Fix bugs
- Provide long-term updates
Thank you for your generosity! π