A high-performance, framework-agnostic, and headless HLS video player engine built with TypeScript and Media Source Extensions (MSE).
FleetPlayer is designed to be lightweight and modular, providing a powerful streaming core while giving developers complete control over the UI.
-
HLS Support: Play
.m3u8streams using Media Source Extensions (MSE). - Native Fallback: Automatically switches to the browser's native HLS pipeline (e.g., Safari, iOS) for maximum compatibility.
- Adaptive Bitrate (ABR): Real-time quality switching based on measured network throughput.
- Headless Core: No UI dependencies. Build your own controls or use a wrapper.
- Web Worker Powered: Bandwidth estimation and segment fetching handled off the main thread.
- TypeScript First: Full type definitions included for a superior developer experience.
- Framework Agnostic: Works seamlessly with React, Vue, Angular, Svelte, or Vanilla JavaScript.
npm install fleetplayer<video id="my-video" controls></video>
<script type="module">
import { FleetPlayer } from 'fleetplayer';
const videoElement = document.getElementById('my-video');
const player = new FleetPlayer(videoElement, {
autoStart: true
});
// Load an HLS stream
await player.load('https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8');
</script>import React, { useEffect, useRef } from 'react';
import { FleetPlayer } from 'fleetplayer';
const VideoPlayer = () => {
const videoRef = useRef<HTMLVideoElement>(null);
const playerRef = useRef<FleetPlayer | null>(null);
useEffect(() => {
if (videoRef.current) {
playerRef.current = new FleetPlayer(videoRef.current);
playerRef.current.load('your-stream-url.m3u8');
}
return () => {
playerRef.current?.destroy();
};
}, []);
return <video ref={videoRef} controls style={{ width: '100%' }} />;
};Initializes a new player instance.
-
videoElement: The HTMLVideoElement to attach to. -
config: (Optional){ autoStart?: boolean }
Parses the manifest and prepares the player for playback.
Standard playback controls.
Manually set the quality level.
-
levelIndex: The index of the level fromgetStats().levels. - Pass
-1for Auto ABR (default).
Returns an object containing real-time performance data:
{
buffered: [{ start: number, end: number }],
bitrate: number, // Current bitrate in bps
level: number, // Current quality level index
levels: [...] // Available quality levels
}Cleans up internal resources, stops workers, and resets the video source.
MIT © aniketyadav