Skip to content

Overview

Playback options: drop-in components across React, Svelte, and Web Components, or raw protocol URLs for HLS, LL-HLS, DASH, WebRTC/WHEP, Mist WebRTC, MP4, WebM/MKV, AAC, TS, H264, WebSocket outputs, and direct RTMP/RTSP/SRT/DTSC when exposed.

npm npm npm npm

PackageUse Case
@livepeer-frameworks/player-reactReact 17+ apps
@livepeer-frameworks/player-svelteSvelte 5 apps
@livepeer-frameworks/player-wcWeb Components — Vue, Angular, CDN, plain HTML
@livepeer-frameworks/player-coreVanilla JS, headless, or building custom integrations

Not sure which package to use? See the Integration Guide.

  • Adaptive bitrate (ABR) — resize-aware and bitrate-aware quality switching.
  • Gateway integration — edge node resolution via the GraphQL API, no manual URL juggling.
  • Lazy-loaded transports — heavy engines load on demand to keep the initial bundle small.
  • Protocol coverage — HLS, LL-HLS, DASH, WebRTC/WHEP, WebSocket, MP4, and direct protocols when exposed.

For the underlying engine selection and protocol scoring, see Playback Advanced.

Your Playback ID is shown in the FrameWorks dashboard under Playback Info. This ID is public-safe.

Primary Protocols:

URL PatternProtocolDescription
/play/{id}/hls/index.m3u8HLS (TS)Best compatibility — browsers, mobile, smart TVs
/play/{id}/cmaf/index.m3u8LL-HLSLower latency HLS variant
/play/{id}/cmaf/index.mpdDASHMPEG-DASH adaptive streaming
/play/{id}/webrtcWebRTC (WHEP)Ultra-low latency (~0.5s)
/play/{id}.mp4MP4Progressive download
/play/{id}.webmWebMOpen format (VP8/VP9)
Terminal window
# Example URLs through Foghorn
https://foghorn.frameworks.network/play/{playback-id}/hls/index.m3u8
https://foghorn.frameworks.network/play/{playback-id}/webrtc
https://foghorn.frameworks.network/play/{playback-id}.mp4
Content TypeIdentifierExample
Live StreamplaybackId (view key)abc123def456
ClipclipHash (32-char hash)f8a2b3c4d5e6...
DVR RecordingdvrHash (32-char hash)a1b2c3d4e5f6...

All content types use the same unified /play/{id} path through Foghorn.

import { Player } from "@livepeer-frameworks/player-react";
<Player
contentType="live"
contentId="<YOUR_PLAYBACK_ID>"
options={{
autoplay: true,
muted: true,
}}
/>;

Call resolveViewerEndpoint from the viewer’s browser or playback device when you want geographic routing to reflect that viewer. The FrameWorks player does this for you: the browser calls Gateway GraphQL, Gateway forwards the request IP to Foghorn, and Foghorn uses that IP for GeoIP and edge scoring.

Do not call resolveViewerEndpoint from your application backend unless you intentionally want routing based on the backend’s IP address. Backend-side resolution cannot know where the final viewer is unless your infrastructure preserves and trusts the viewer IP all the way to Gateway.

For custom players that do not use the FrameWorks player, use the playback DNS name directly. Paid tenants should prefer their tenant playback domain:

Terminal window
https://foghorn.{tenant}.cdn.{base}/play/{playback-id}/hls/index.m3u8

That tenant domain spans every subscribed delivery pool: FrameWorks platform-official clusters, private clusters, and marketplace clusters. If a tenant alias is not available, use the global root playback domain, then the cluster-concrete Foghorn domain shown in the dashboard. HTTP playback URLs can go through /play because Foghorn can return JSON or issue a 307 redirect from the viewer’s request.

/play is a redirect + resolver endpoint for direct protocol URLs and CLI tools. It returns 307 redirects to edge nodes.

Terminal window
# Play in VLC
vlc https://foghorn.frameworks.network/play/abc123def/hls/index.m3u8
# Embed in HTML (Safari, iOS)
<video src="https://foghorn.frameworks.network/play/abc123def/hls/index.m3u8" controls></video>
# Record with ffmpeg
ffmpeg -i https://foghorn.frameworks.network/play/abc123def/hls/index.m3u8 -c copy output.mp4
Terminal window
curl https://foghorn.frameworks.network/play/{view-key}

Returns all available protocols, primary and fallback nodes:

{
"primary": {
"node_id": "edge-7",
"base_url": "https://edge-egress.frameworks.network",
"outputs": {
"HLS": {"url": "https://foghorn.frameworks.network/play/stream-id/hls/index.m3u8"},
"WHEP": {"url": "https://foghorn.frameworks.network/play/stream-id/webrtc"}
}
},
"fallbacks": [...]
}
URL PatternProtocolDescription
srt://<host>:<port>?streamid={id}SRTSecure Reliable Transport
rtsp://<host>:<port>/play/{id}RTSPIP cameras, VLC, ffmpeg
rtmp://<host>:<port>/play/{id}RTMPLegacy Flash players
/play/{id}.tsMPEG-TSTransport stream
/play/{id}.flvFLVFlash Video
/play/{id}.mkvMKVMatroska container
/play/{id}.aacAACAudio-only stream

Use the DVR playbackId with contentType="dvr" for the active live DVR window (the rolling seek-back surface of an actively recording stream). For historical replay, list the recording’s chapters via the dvrChapters query — each finalized chapter has its own public playbackId that addresses a regular VOD-shaped artifact. Hand that chapter playbackId to your player exactly the way you would for any VOD; a 90-day recording is navigated one chapter at a time instead of as one giant playlist.

See Recordings, Clips & VOD and DVR Chapters for the 24/7 DVR model.

In multi-cluster deployments, Foghorn handles cross-cluster routing transparently. When a viewer requests a stream from a remote cluster, Foghorn arranges origin-pull replication or redirects via HTTP 307.

The player SDK handles this automatically when it runs in the viewer’s browser or playback device: Gateway resolution returns the right Foghorn-backed edge endpoints for that viewer’s region.

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<video id="video" controls></video>
<script>
const video = document.getElementById("video");
const hlsUrl = "https://foghorn.frameworks.network/play/{playback-id}/hls/index.m3u8";
if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource(hlsUrl);
hls.attachMedia(video);
} else if (video.canPlayType("application/vnd.apple.mpegurl")) {
video.src = hlsUrl;
}
</script>
<link href="https://vjs.zencdn.net/8.0.4/video-js.css" rel="stylesheet" />
<script src="https://vjs.zencdn.net/8.0.4/video.min.js"></script>
<video-js id="my-video" class="video-js" controls data-setup="{}">
<source src="https://foghorn.frameworks.network/play/{playback-id}/hls/index.m3u8" type="application/x-mpegURL" />
</video-js>
  • Is the stream live? HLS playlists and WHEP endpoints are only active while broadcasting.
  • Check the ID: Use the Playback ID, not the Stream Key.
  • Viewer connection: Insufficient bandwidth for the source bitrate.
  • Source bitrate: Encoder pushing too high for upload/download speeds.
  • Browser policies: Most browsers block autoplay with sound. Set muted={true} for autoplay. The player shows a “Click to Unmute” overlay.
  • Protocol choice: HLS has 10-30s latency. Use WebRTC (WHEP) for sub-second latency.