Skip to content
FrameworkStyle

cloudflare-video

Video component that plays Cloudflare Stream videos through the Stream player

Cloudflare Stream runs in an embedded player. Its own chrome stays hidden by default, so it drops into a player skin like any other media component; set controls to use Cloudflare’s UI instead.

Import

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

Or load it from the CDN:

<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.0.0-beta.32/media/cloudflare-video.js"></script>

Load a source

src takes a raw 32-character video UID, any cloudflarestream.com or videodelivery.net URL, or a signed token. Watch, embed, iframe, manifest, and thumbnail URLs all carry the UID in the same position, and a signed token stands in for the UID wherever one appears.

<cloudflare-video src="https://watch.videodelivery.net/bfbd585059e33391d67b0f1d15fe6ea4"></cloudflare-video>

Signed playback

For signed URLs, pass the signed token wherever the UID would go: as the whole src, or inside a Stream URL. Keep your customer subdomain when your URLs name one. Cloudflare serves signed and access-controlled videos only from customer-<code>.cloudflarestream.com, so the element preserves that origin instead of collapsing it onto the shared host.

Behavior

A few things work differently from a native <video> element, because the Stream embed doesn’t expose them:

  • The embed owns text tracks: textTracks stays empty, and engine.cloudflare.defaultTextTrack picks the track to show.
  • Picture-in-picture is unavailable, and the player reports it as unsupported.
  • Fullscreen targets the iframe, so Cloudflare’s own chrome shows in fullscreen.
  • playsInline has no effect: the Stream embed always plays inline.

Examples

Basic Usage

<cloudflare-video class="cloudflare-video" src="https://watch.videodelivery.net/bfbd585059e33391d67b0f1d15fe6ea4" controls></cloudflare-video>

API Reference

Attributes

These attributes configure the embedded media adapter:

AttributeTypeDefaultDetails
autoplaybooleanfalse
controlsbooleanfalse
loopbooleanfalse
mutedbooleanfalse
playsinlinebooleantrue
posterstring''
preloadMediaPreloadType'metadata'
srcstring''

Properties

PropertyTypeDefaultDetails
autoplaybooleanfalse
bufferedTimeRangeLike
controlsbooleanfalse
currentSrcstring
currentTimenumber
defaultMutedbooleanfalse
durationnumber
endedboolean
engine{ play(): Promise<void> | void; pause(): void; addEventListener(type: string, listener: ((event: Event) => void)): void; removeEventListener(type: string, listener: ((event: Event) => void)): void; src: string; currentTime: number; volume: number; muted: boolean; playbackRate: number; loop: boolean; autoplay: boolean; controls: boolean; preload: string; poster: string; paused: boolean; ended: boolean; seeking: boolean; duration: number; buffered: TimeRanges; played: TimeRanges; videoWidth: number; videoHeight: number } | null
errorMediaError | null
isFullscreenboolean
loopbooleanfalse
mutedbooleanfalse
pausedboolean
playbackRatenumber
played{ length: number; start(index: number): number; end(index: number): number }
playsInlinebooleantrue
posterstring''
preloadMediaPreloadType'metadata'
readyStatenumber
seekableTimeRangeLike
seekingboolean
source{ src?: string; engine?: CloudflareSourceEngineConfig } | nullnull
srcstring''
textTracksTextTrackListLike
videoHeightnumber
videoWidthnumber
volumenumber

Engine options

source.engine.cloudflare

Pass Stream player parameters under source.engine.cloudflare, spelled exactly as Cloudflare spells them, plus anything Cloudflare adds next. They’re serialized onto the embed URL untouched, and the embed reads them once, when its URL is built. Media Sources covers how engine options fit into a structured source.

controls, autoplay, loop, muted, preload, and poster come from the props of the same name, so they have no engine.cloudflare spelling.

const video = document.querySelector('cloudflare-video');
video.source = {
  src: 'bfbd585059e33391d67b0f1d15fe6ea4',
  engine: { cloudflare: { primaryColor: '#f03e3e', startTime: '5m30s' } },
};
OptionTypeDetails
ad-urlstring | undefined
defaultTextTrackstring | undefined
letterboxColorstring | undefined
primaryColorstring | undefined
referrerPolicyReferrerPolicy | undefined
startTimenumber | string | undefined

Methods

Supports these media methods: afterLoadbeginLoadbindPlayerEventscreatePlayercreatePlayerApiexitFullscreenisStaleloadonErroronLoadedpausepauseEmbedplayrequestFullscreenresetStatesnapshotPropsunbindPlayerEvents

Events

Implements these standard media events through the embedded player: durationchangeemptiederrorloadedmetadataloadstartvolumechange

Also emits these Video.js-specific events:

EventDescription
loadcomplete
sourcechangeFired when `source` changes, either directly or by resolving a new `src`. Read `source` for the new value.