Skip to content
FrameworkStyle

Overview

How Video.js players are structured — state, UI, and media

Video.js v10 is built around a three-part architecture that separates concerns and maximizes flexibility. Each part is designed to work independently or together, allowing you to use as much or as little of Video.js as you need.

For the reasoning behind this design, see Why Video.js?.

1. State management

State is handled by a video-player element, which creates a central state store that all components can access. Child components can automatically connect to the state of the video-player element.

<!-- All components inside automatically connect to state -->
<video-player>
  <video-skin>
    <video src="video.mp4"></video>
  </video-skin>
</video-player>

You can access state and actions from anywhere within <video-player> with PlayerController.

2. User interface

Use a prebuilt skin or build your own from the individual UI components.

Skins

Skins are complete, pre-designed player UIs that package components and styles together. They give you a polished starting point, with a small set of CSS custom properties for common visual changes. They don’t try to cover every player with options.

<video-player>
  <video-skin>
    <video src="video.mp4"></video>
  </video-skin>
</video-player>

UI components

If you want more control than a packaged skin offers, build your own UI from our components. Add, remove, and rearrange them to build the player you need.

<video-player>
  <media-container>
    <video src="video.mp4"></video>
    <media-controls>
      <media-controls-content>
        <media-play-button></media-play-button>
        <!-- ... -->
      </media-controls-content>
    </media-controls>
  </media-container>
</video-player>

The easiest way to get started is to eject the closest skin and use its pre-styled components as a foundation.

3. Media

Media components are the components that actually display your media. They’re essentially “players with no UI”. They handle the video/audio rendering and expose a consistent API.

Media components can be format specific (HLS, DASH), service specific (YouTube, Vimeo, Mux), or use case specific (background video).

Media elements are discovered automatically. Plain <video> and <audio> elements are found via a querySelector. Custom media elements like <hlsjs-video> register themselves after you import their registration entry point.

<video-player>
  <video-skin>
    <hlsjs-video src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM.m3u8"></hlsjs-video>
  </video-skin>
</video-player>

Presets

Presets preconfigure these parts for a specific use case.

The default presets are @videojs/html/video and @videojs/html/audio, covering the baseline set of controls you’d expect from the HTML <video> and <audio> tags.

Beyond the defaults, presets target more specific use cases. The /background preset combines a media element with autoplay, mute, and loop built in, a skin with no controls, and only the features needed to power it.

You can use it from the @videojs/html/background/* registration entry points.