Skip to content

ReferenceMedia

shaka-video

Unstable

Video element powered by Shaka Player for DASH, HLS, and progressive playback with DRM

Choose Shaka Player when one media component needs to play DASH, HLS, and progressive files, or when playback requires DRM.

Import

pnpm add @videojs/shaka-video
import '@videojs/html/media/shaka-video';

Or load it from the CDN:

<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.0.0-rc.4/media/shaka-video.js"></script>

Load a source

src takes a manifest URL. DASH, HLS, and progressive files all go through the same property, and Shaka picks the parser from the URL.

<shaka-video src="https://example.com/manifest.mpd"></shaka-video>

When the URL carries no extension to go on, name the type with source.type. That’s what makes an extensionless manifest playable.

const video = document.querySelector('shaka-video');
video.source = { src: 'https://example.com/manifest', type: 'application/dash+xml' };

Protected content

source.drm names your license servers, keyed by EME key system id. Name every system you hold a license server for: which one gets negotiated is the browser’s choice.

const video = document.querySelector('shaka-video');
video.source = {
  src: 'https://example.com/manifest.mpd',
  drm: {
    'com.widevine.alpha': { licenseUrl: 'https://example.com/widevine' },
    'com.apple.fps': {
      licenseUrl: 'https://example.com/fairplay',
      serverCertificateUrl: 'https://example.com/fairplay.cer',
    },
  },
};

FairPlay needs a serverCertificateUrl unless its CDM is pre-provisioned; Widevine and PlayReady ignore it. source.drm takes the same shape as hls.js’s own drmSystems, so one object describes DRM for either engine.

For the parts of Shaka’s DRM configuration this doesn’t cover, configure Shaka directly. A drm.servers under source.engine.shaka replaces source.drm rather than merging with it.

Behavior

  • Adaptation stays within renditions no larger than the element rendering them, through Shaka’s abr.restrictToElementSize. Override it under source.engine.shaka.
  • preload="none" defers the load until playback is asked for; autoplay or a play() counts as asking.
  • preload="metadata" loads, then holds Shaka’s buffering goals down to a second until preload rises to auto.
  • streamType is detected from the manifest, so a player skin renders live and on-demand content correctly without being told which it is.
  • Changing source.engine.shaka reconfigures the running player in place instead of recreating it.

Examples

Basic Usage

<media-container class="media-container">
  <shaka-video src="https://dash.akamaized.net/akamai/streamroot/050714/Spring_4Ktest.mpd" autoplay muted playsinline loop></shaka-video>
</media-container>

API Reference

Attributes

Forwards these standard media attributes to the internal <video>. See the MDN media element reference: autopictureinpictureautoplaycontrolscontrolslistcrossorigindisablepictureinpicturedisableremoteplaybackloadingloopmutedplaysinlineposterpreloadsrc

These Video.js-specific attributes configure media behavior:

AttributeTypeDefault
stream-type'on-demand' | 'live' | 'unknown''unknown'

Properties

PropertyTypeDefaultDetails
contentDataMediaContentData | undefined—
engineshaka.Player | null—
errorunknown—
isFullscreenboolean—
isPictureInPictureboolean—
liveEdgeStartnumber—
preload'' | 'none' | 'metadata' | 'auto''metadata'
sourceobjectnull
srcstring''
streamType'on-demand' | 'live' | 'unknown''unknown'
targetLiveWindownumber—
webkitCurrentPlaybackTargetIsWirelessboolean | undefined—
webkitPresentationModeWebKitPresentationMode | undefined—
webkitSetPresentationModeundefined | function—

Also exposes these properties from the native media API. See HTMLVideoElement for details: autoplaybufferedcontrolscrossOrigincurrentSrccurrentTimedefaultMuteddefaultPlaybackRatedisablePictureInPicturedisableRemotePlaybackdurationendedloopmutedpausedplaybackRateplayedplaysInlineposterreadyStateremoteseekableseekingtextTrackstitlevideoHeightvideoWidthvolume

Methods

Supports these media methods. See HTMLVideoElement for details: addTextTrackcanPlayTypeexitFullscreenexitPictureInPictureloadpauseplayrequestFullscreenrequestPictureInPicture

Events

Re-dispatches these standard media events from the internal media element: abortaddtrackcanplaycanplaythroughchangecontentdatachangedurationchangeemptiedendedenterpictureinpictureleavepictureinpictureloadeddataloadedmetadataloadstartpauseplayplayingprogressratechangeremovetrackresizeseekedseekingstalledsuspendtimeupdatevolumechangewaiting

Also emits these Video.js-specific events:

EventDescription
errorFired when playback fails in a way Shaka could not recover from. Read error for the failure.
sourcechangeFired when source changes, either directly or by resolving a new src. Read source for the new value.
streamtypechangeFired when the detected stream type changes. Read streamType for the new value.
targetlivewindowchangeFired when targetLiveWindow changes. Read it for the new value.

CSS custom properties

VariableDescription
--media-video-border-radiusBorder radius of the video element.
--media-object-fitObject fit for the video.
--media-object-positionObject position for the video.
--media-caption-track-durationDuration of the caption track transition.
--media-caption-track-delayDelay before the caption track transition.
--media-caption-track-yVertical offset of the caption track.