Skip to content

MediaFox Player API

Constructor

new MediaFox(options?)

Creates a new player instance with comprehensive media playback capabilities.

typescript
constructor(options?: PlayerOptions)

Options

PropertyTypeDefaultDescription
renderTargetHTMLCanvasElement | OffscreenCanvasundefinedCanvas element for video rendering
audioContextAudioContextundefinedAudio context for audio playback
volumenumber1Initial volume level (0-1)
mutedbooleanfalseInitial mute state
playbackRatenumber1Initial playback speed (0.25-4)
autoplaybooleanfalseAuto-play when media loads
preload'none' | 'metadata' | 'auto''metadata'Preloading strategy
crossOriginstringundefinedCORS setting for cross-origin content
maxCacheSizenumberundefinedMaximum cache size for buffering
renderer'webgpu' | 'webgl' | 'canvas2d'Auto-detectedRendering backend (auto-detects best available)

Example

typescript
// Basic setup
const player = new MediaFox({
  renderTarget: document.querySelector('#video-canvas'),
  volume: 0.8,
  autoplay: true
});

// Advanced configuration
const advancedPlayer = new MediaFox({
  renderTarget: canvas,
  audioContext: new AudioContext(),
  volume: 0.7,
  muted: false,
  playbackRate: 1.0,
  autoplay: false,
  preload: 'metadata',
  crossOrigin: 'anonymous',
  maxCacheSize: 200 * 1024 * 1024, // 200MB
  renderer: 'webgpu' // Use WebGPU renderer (falls back automatically if unavailable)
});

Interactive Demo

Try the player with different configurations:

0:00 / 0:00

Properties

Playback Properties

PropertyTypeRead/WriteDescription
currentTimenumberR/WCurrent playback position in seconds
durationnumberRTotal duration in seconds (from state)
pausedbooleanRWhether playback is paused
endedbooleanRWhether playback has ended
seekingbooleanRWhether seeking is in progress

Audio Properties

PropertyTypeRead/WriteDescription
volumenumberR/WVolume level (0-1)
mutedbooleanR/WMute state
playbackRatenumberR/WPlayback speed (0.25-4)

Interactive Property Demo

Try changing these properties in real-time:

Methods

Media Loading

load(source, options?)

Loads media from various sources.

typescript
async load(
  source: MediaSource,
  options?: LoadOptions
): Promise<void>

Parameters:

  • source: File, Blob, URL, ArrayBuffer, Uint8Array, or ReadableStream
  • options: Optional loading configuration

Example:

typescript
// Load from file
await player.load(fileInput.files[0]);

// Load from URL
await player.load('https://example.com/video.mp4');

// Load from blob
await player.load(blob, {
  preload: 'metadata'
});

Playback Control

play()

Starts or resumes playback.

typescript
async play(): Promise<void>

Example:

typescript
await player.play();

pause()

Pauses playback.

typescript
pause(): void

Example:

typescript
player.pause();

stop()

Stops playback and resets to the beginning.

typescript
async stop(): Promise<void>

Example:

typescript
await player.stop();

seek(time, options?)

Seeks to a specific time position.

typescript
async seek(
  time: number,
  options?: SeekOptions
): Promise<void>

Parameters:

  • time: Target time in seconds
  • options.precise: Whether to seek to exact frame (slower but precise)
  • options.keyframe: Whether to seek to keyframes only (faster but less precise)

Example:

typescript
// Quick seek
await player.seek(30);

// Precise seek to exact frame
await player.seek(30, { precise: true });

// Keyframe-only seek (fastest)
await player.seek(30, { keyframe: true });

Track Management

getVideoTracks()

Returns all available video tracks.

typescript
getVideoTracks(): VideoTrackInfo[]

Returns: Array of video track information objects

Example:

typescript
const videoTracks = player.getVideoTracks();
videoTracks.forEach(track => {
  console.log(`${track.codec} ${track.width}x${track.height}`);
});

getAudioTracks()

Returns all available audio tracks.

typescript
getAudioTracks(): AudioTrackInfo[]

Returns: Array of audio track information objects

Example:

typescript
const audioTracks = player.getAudioTracks();
audioTracks.forEach(track => {
  console.log(`${track.codec} ${track.channels}ch ${track.sampleRate}Hz`);
});

selectVideoTrack(trackId)

Selects a specific video track.

typescript
async selectVideoTrack(trackId: string | null): Promise<void>

Parameters:

  • trackId: ID of the video track to select (or null to disable video)

Example:

typescript
const tracks = player.getVideoTracks();
await player.selectVideoTrack(tracks[0].id);

selectAudioTrack(trackId)

Selects a specific audio track.

typescript
async selectAudioTrack(trackId: string | null): Promise<void>

Parameters:

  • trackId: ID of the audio track to select (or null to disable audio)

Example:

typescript
const tracks = player.getAudioTracks();
await player.selectAudioTrack(tracks[1].id);

getSubtitleTracks()

Returns all available subtitle tracks.

typescript
getSubtitleTracks(): SubtitleTrackInfo[]

Returns: Array of subtitle track information objects

Example:

typescript
const subtitleTracks = player.getSubtitleTracks();
subtitleTracks.forEach(track => {
  console.log(`${track.language}: ${track.name || 'Subtitle'}`);
});

selectSubtitleTrack(trackId)

Selects a specific subtitle track.

typescript
selectSubtitleTrack(trackId: string | null): void

Parameters:

  • trackId: ID of the subtitle track to select (or null to disable subtitles)

Example:

typescript
const tracks = player.getSubtitleTracks();
player.selectSubtitleTrack(tracks[0].id);

// Disable subtitles
player.selectSubtitleTrack(null);

registerSubtitleTracks(sourceId, registrations)

Registers external subtitle tracks.

typescript
registerSubtitleTracks(
  sourceId: string,
  registrations: SubtitleTrackRegistration[]
): void

Parameters:

  • sourceId: Unique identifier for this subtitle source
  • registrations: Array of subtitle track registrations

Example:

typescript
player.registerSubtitleTracks('external-subs', [
  {
    info: {
      id: 'en-subs',
      codec: null,
      language: 'en',
      name: 'English Subtitles',
      selected: false
    },
    resolver: async () => ({
      format: 'srt',
      content: await fetch('/subtitles/en.srt').then(r => r.text())
    })
  }
]);

unregisterSubtitleTracks(sourceId)

Removes previously registered subtitle tracks.

typescript
unregisterSubtitleTracks(sourceId: string): void

Parameters:

  • sourceId: ID of the subtitle source to remove

Example:

typescript
player.unregisterSubtitleTracks('external-subs');

getSubtitleTrackResource(trackId)

Gets the resource data for a subtitle track.

typescript
async getSubtitleTrackResource(
  trackId: string | null
): Promise<SubtitleTrackResource | null>

Parameters:

  • trackId: ID of the subtitle track

Returns: Subtitle resource data or null

Example:

typescript
const resource = await player.getSubtitleTrackResource('en-subs');
if (resource) {
  console.log('Format:', resource.format);
  if (resource.content) {
    console.log('Content loaded');
  } else if (resource.url) {
    console.log('URL:', resource.url);
  }
}

Playlist Management

loadPlaylist(items, options?)

Loads a playlist of media items.

typescript
async loadPlaylist(
  items: Array<MediaSource | { mediaSource: MediaSource; title?: string; poster?: string }>,
  options?: { autoplay?: boolean; startTime?: number }
): Promise<void>

Parameters:

  • items: Array of media sources or playlist item configurations
  • options.autoplay: Whether to start playing immediately (default: false)
  • options.startTime: Start time in seconds for the first item (default: 0)

Example:

typescript
// Basic playlist
await player.loadPlaylist([
  { mediaSource: 'video1.mp4', title: 'First Video' },
  { mediaSource: 'video2.mp4', title: 'Second Video' },
  'video3.mp4' // Simple URL also works
]);

// With autoplay and start time
await player.loadPlaylist(
  [{ mediaSource: 'video.mp4', title: 'My Video' }],
  { autoplay: true, startTime: 30 }
);

addToPlaylist(item, index?)

Adds an item to the playlist.

typescript
addToPlaylist(
  item: MediaSource | { mediaSource: MediaSource; title?: string; poster?: string },
  index?: number
): void

Parameters:

  • item: Media source or playlist item configuration
  • index: Position to insert at (optional, defaults to end)

Example:

typescript
// Add to end
player.addToPlaylist({ mediaSource: 'new.mp4', title: 'New Video' });

// Add at specific position
player.addToPlaylist('video.mp4', 0); // Add at start

removeFromPlaylist(index)

Removes an item from the playlist.

typescript
async removeFromPlaylist(index: number): Promise<void>

Parameters:

  • index: Index of item to remove

Example:

typescript
await player.removeFromPlaylist(2); // Remove third item

clearPlaylist()

Clears the entire playlist.

typescript
clearPlaylist(): void

Example:

typescript
player.clearPlaylist();

next()

Advances to the next playlist item.

typescript
async next(): Promise<void>

Example:

typescript
await player.next();

prev()

Goes to the previous playlist item.

typescript
async prev(): Promise<void>

Example:

typescript
await player.prev();

jumpTo(index)

Jumps to a specific playlist item.

typescript
async jumpTo(index: number): Promise<void>

Parameters:

  • index: Index of item to jump to

Example:

typescript
await player.jumpTo(2); // Jump to third item

Playlist Properties

PropertyTypeRead/WriteDescription
playlistPlaylistItem[]RCurrent playlist items
playlistIndexnumber | nullRIndex of currently playing item
nowPlayingPlaylistItem | nullRCurrently playing item
playlistModePlaylistModeR/WPlaylist playback mode

Playlist Modes

typescript
type PlaylistMode = 'sequential' | 'manual' | 'repeat' | 'repeat-one' | null;
  • null (default): No playlist behavior (single source)
  • 'manual': Navigation via next()/prev()/jumpTo() only
  • 'sequential': Auto-advance to next item on end
  • 'repeat': Loop entire playlist
  • 'repeat-one': Repeat current item continuously

Example:

typescript
// Set playlist mode
player.playlistMode = 'sequential';

// Access playlist data
console.log(player.playlist);       // Array of items
console.log(player.playlistIndex);  // Current index
console.log(player.nowPlaying);     // Current item

Playlist Events

EventData TypeDescription
playlistchange{ playlist: Playlist }Playlist was loaded or cleared
playlistitemchange{ index: number, item: PlaylistItem, previousIndex?: number }Current item changed
playlistendvoidEnd of playlist reached (sequential/manual)
playlistadd{ item: PlaylistItem, index: number }Item added to playlist
playlistremove{ index: number }Item removed from playlist
playlistitemerror{ index: number, error: Error }Failed to load playlist item

Example:

typescript
player.on('playlistitemchange', ({ index, item, previousIndex }) => {
  console.log(`Now playing: ${item.title} (${index + 1}/${player.playlist.length})`);
});

player.on('playlistend', () => {
  console.log('Playlist finished');
});

Advanced Features

screenshot(options?)

Takes a screenshot of the current video frame.

typescript
async screenshot(options?: ScreenshotOptions): Promise<Blob | null>

Parameters:

  • options.format: Image format ('png', 'jpeg', 'webp')
  • options.quality: JPEG/WebP quality (0-1)

Returns: Blob containing the image data

Example:

typescript
// PNG screenshot
const blob = await player.screenshot();

// JPEG with quality
const jpegBlob = await player.screenshot({
  format: 'jpeg',
  quality: 0.9
});

// Download screenshot
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'screenshot.png';
a.click();
URL.revokeObjectURL(url);

setRenderTarget(target)

Changes the rendering target canvas.

typescript
setRenderTarget(target: HTMLCanvasElement | OffscreenCanvas | null): void

Parameters:

  • target: New canvas element or null to disable rendering

Example:

typescript
// Change canvas
const newCanvas = document.querySelector('#new-canvas');
player.setRenderTarget(newCanvas);

// Use OffscreenCanvas for worker rendering
const offscreen = canvas.transferControlToOffscreen();
player.setRenderTarget(offscreen);

getRendererType()

Gets the current renderer type being used.

typescript
getRendererType(): RendererType

Returns: Current renderer type ('webgpu', 'webgl', or 'canvas2d')

Example:

typescript
const renderer = player.getRendererType();
console.log(`Using ${renderer} renderer`);

switchRenderer(type)

Switches to a different renderer backend with automatic fallback.

typescript
async switchRenderer(type: RendererType): Promise<void>

Parameters:

  • type: Target renderer type ('webgpu', 'webgl', or 'canvas2d')

Example:

typescript
// Switch to WebGL renderer
await player.switchRenderer('webgl');

// Try WebGPU with automatic fallback if unavailable
try {
  await player.switchRenderer('webgpu');
} catch (error) {
  console.log('Renderer switch failed, using fallback');
}

getSupportedRenderers() (Static)

Gets list of supported renderers in the current environment.

typescript
static getSupportedRenderers(): RendererType[]

Returns: Array of supported renderer types in preference order

Example:

typescript
const supported = MediaFox.getSupportedRenderers();
console.log('Supported renderers:', supported);
// Output: ['webgpu', 'webgl', 'canvas2d'] or ['webgl', 'canvas2d'] etc.

// Use best available renderer
const player = new MediaFox({
  renderTarget: canvas,
  renderer: supported[0] // Use best available
});

State Management

subscribe(listener)

Subscribes to all state changes.

typescript
subscribe(listener: (state: PlayerStateData) => void): Subscription

Parameters:

  • listener: Callback function that receives state updates

Returns: Subscription object with unsubscribe() method

Example:

typescript
const subscription = player.subscribe(state => {
  console.log(`Time: ${state.currentTime}/${state.duration}`);
  console.log(`Playing: ${state.playing}`);
  console.log(`Volume: ${state.volume}`);
});

// Later, unsubscribe
subscription.unsubscribe();

getState()

Gets the current player state.

typescript
getState(): PlayerStateData

Returns: Current state object

Example:

typescript
const state = player.getState();
console.log(`Current time: ${state.currentTime}`);
console.log(`Duration: ${state.duration}`);
console.log(`Playing: ${state.playing}`);
console.log(`Volume: ${state.volume}`);

Event Handling

on(event, listener)

Adds an event listener.

typescript
on<K extends keyof PlayerEventMap>(
  event: K,
  listener: (data: PlayerEventMap[K]) => void
): UnsubscribeFn

Parameters:

  • event: Event name
  • listener: Event handler function

Returns: Function to remove the listener

Example:

typescript
const unsubscribe = player.on('play', () => {
  console.log('Playback started');
});

player.on('error', (error) => {
  console.error('Player error:', error);
});

// Remove listener
unsubscribe();

once(event, listener)

Adds a one-time event listener.

typescript
once<K extends keyof PlayerEventMap>(
  event: K,
  listener: (data: PlayerEventMap[K]) => void
): UnsubscribeFn

Parameters:

  • event: Event name
  • listener: Event handler function

Returns: Function to remove the listener

Example:

typescript
player.once('loadedmetadata', (info) => {
  console.log('Media loaded:', info);
});

off(event, listener?)

Removes event listener(s).

typescript
off<K extends keyof PlayerEventMap>(
  event: K,
  listener?: (data: PlayerEventMap[K]) => void
): void

Parameters:

  • event: Event name
  • listener: Specific listener to remove (optional)

Example:

typescript
// Remove specific listener
player.off('play', playHandler);

// Remove all listeners for an event
player.off('play');

Cleanup

dispose()

Releases resources but keeps the instance usable.

typescript
dispose(): void

Example:

typescript
player.dispose();
// Player can still be used after loading new media

destroy()

Completely destroys the player instance.

typescript
destroy(): void

Example:

typescript
player.destroy();
// Player instance should not be used after this

Events

MediaFox emits various events during playback. All events are strongly typed.

Media Events

EventData TypeDescription
loadstartvoidLoading has started
loadedmetadataMediaInfoMetadata has been loaded
loadeddatavoidFirst frame is available
canplayvoidPlayback can start
canplaythroughvoidPlayback can continue without buffering

Playback Events

EventData TypeDescription
playvoidPlayback has started
pausevoidPlayback has been paused
playingvoidPlayback has resumed
endedvoidPlayback has ended
seeking{ currentTime: number }Seeking has started
seeked{ currentTime: number }Seeking has completed
waitingvoidWaiting for data

State Change Events

EventData TypeDescription
timeupdate{ currentTime: number }Playback position has changed
durationchange{ duration: number }Duration has changed
volumechange{ volume: number, muted: boolean }Volume or mute state has changed
ratechange{ playbackRate: number }Playback rate has changed
progress{ buffered: TimeRange[] }Download progress

Track Events

EventData TypeDescription
trackchange{ type: 'video' | 'audio' | 'subtitle', trackId: string | null }Track selection has changed
resize{ width: number, height: number }Video dimensions have changed

Warning Events

EventData TypeDescription
warning{ type: string, message: string, error?: Error }Non-fatal warning occurred

Renderer Events

EventData TypeDescription
rendererchangeRendererTypeRenderer backend has changed
rendererfallback{ from: RendererType, to: RendererType }Renderer has fallen back to a different backend

Error Events

EventData TypeDescription
errorMediaFoxErrorAn error has occurred

Event Example

typescript
// Listen to all major events
player.on('loadstart', () => {
  console.log('Loading started');
});

player.on('loadedmetadata', (info) => {
  console.log(`Duration: ${info.duration}s`);
  console.log(`Has video: ${info.hasVideo}`);
  console.log(`Has audio: ${info.hasAudio}`);
});

player.on('play', () => {
  console.log('Playback started');
});

player.on('timeupdate', ({ currentTime }) => {
  updateProgressBar(currentTime);
});

player.on('error', (error) => {
  console.error(`Error ${error.code}: ${error.message}`);
});

// Listen to renderer events
player.on('rendererchange', (type) => {
  console.log(`Renderer changed to: ${type}`);
});

player.on('rendererfallback', ({ from, to }) => {
  console.warn(`Renderer fallback: ${from} -> ${to}`);
});

Type Definitions

PlayerStateData

Complete player state object returned by subscribe() and getState().

typescript
interface PlayerStateData {
  // Playback state
  state: PlayerState;
  playing: boolean;
  paused: boolean;
  ended: boolean;
  seeking: boolean;

  // Time
  currentTime: number;
  duration: number;
  buffered: TimeRange[];

  // Audio
  volume: number;
  muted: boolean;
  playbackRate: number;

  // Media info
  mediaInfo: MediaInfo | null;
  videoTracks: VideoTrackInfo[];
  audioTracks: AudioTrackInfo[];
  subtitleTracks: SubtitleTrackInfo[];
  selectedVideoTrack: string | null;
  selectedAudioTrack: string | null;
  selectedSubtitleTrack: string | null;
  canPlay: boolean;
  canPlayThrough: boolean;
  isLive: boolean;

  // Renderer
  rendererType: RendererType;

  // Error state
  error: Error | null;
}

MediaInfo

Information about loaded media.

typescript
interface MediaInfo {
  duration: number;
  format: string;
  mimeType: string;
  metadata: MetadataTags;
  hasVideo: boolean;
  hasAudio: boolean;
  hasSubtitles: boolean;
}

VideoTrackInfo

Video track information.

typescript
interface VideoTrackInfo {
  id: string;
  codec: VideoCodec | null;
  language: string;
  name: string | null;
  width: number;
  height: number;
  frameRate: number;
  bitrate: number;
  rotation: 0 | 90 | 180 | 270;
  selected: boolean;
  decodable: boolean;
  converted?: boolean;
}

AudioTrackInfo

Audio track information.

typescript
interface AudioTrackInfo {
  id: string;
  codec: AudioCodec | null;
  language: string;
  name: string | null;
  channels: number;
  sampleRate: number;
  bitrate: number;
  selected: boolean;
  decodable: boolean;
  converted?: boolean;
}

RendererType

Supported rendering backends for video playback.

typescript
type RendererType = 'webgpu' | 'webgl' | 'canvas2d';
  • webgpu: Modern GPU-accelerated rendering using WebGPU API (best performance)
  • webgl: Hardware-accelerated rendering using WebGL (broad compatibility)
  • canvas2d: Software rendering using Canvas 2D API (universal fallback)

PlaylistItem

Information about a playlist item.

typescript
interface PlaylistItem {
  id: string;                      // Unique identifier
  mediaSource: MediaSource;        // The media source
  title?: string;                  // Display title
  poster?: string;                 // Poster/thumbnail URL
  savedPosition: number | null;    // Saved playback position
  duration: number | null;         // Duration (populated after loading)
}

PlaylistMode

Playlist playback behavior.

typescript
type PlaylistMode = 'sequential' | 'manual' | 'repeat' | 'repeat-one' | null;
  • null: No playlist behavior (default)
  • 'sequential': Auto-advance to next item when current ends
  • 'manual': Only advance via explicit next()/prev()/jumpTo() calls
  • 'repeat': Loop entire playlist (after last item, go to first)
  • 'repeat-one': Repeat current item continuously

MIT License