flex_video_player

A flexible, production-ready Flutter video player package for Android, iOS, macOS, and Web.

Built with a clean public API over video_player, so the underlying engine can be replaced without changing consumer code.

Platform Support

Android iOS macOS Web

Features

  • Sources: Network MP4, HLS .m3u8, asset, local file, offline file
  • Resolvers: Vimeo and Bunny resolver structure with custom callback support
  • Playback: Play, pause, seek, position, duration, progress percentage
  • Audio: Mute/unmute, volume control
  • Speed: Configurable playback speed
  • Display: Fullscreen, portrait/landscape, system UI handling
  • Quality: Quality selector with backend MP4 URLs + Auto HLS option
  • Subtitles: WebVTT subtitles with custom styling
  • Reels: Vertical video reels mode (PageView-based)
  • UX: Loading overlay, buffering overlay, error overlay with retry
  • Lifecycle: App background/foreground handling
  • Wakelock: Keep screen on while playing (wakelock_plus)
  • Retry: Auto and manual retry with exponential backoff
  • Tracking: Analytics events and progress callbacks
  • Protection: Optional screen protection (Android FLAG_SECURE, iOS capture detection)
  • Config: Every feature is independently configurable

Installation

dependencies:
  flex_video_player: ^0.1.0

Quick Start

final controller = FlexVideoController(
  source: FlexVideoSource.hls(url: 'https://example.com/video.m3u8'),
  config: const FlexVideoConfig(
    autoPlay: true,
    wakelock: FlexWakelockConfig(enabled: true),
  ),
);

FlexVideoPlayer(
  controller: controller,
  onCompleted: () => debugPrint('Done'),
  onError: (error) => debugPrint('Error: ${error.message}'),
);

Note: Full API documentation and more examples will be added as features are implemented phase by phase.

Web Support

flex_video_player compiles and runs on Flutter Web. The table below documents each feature's Web behaviour.

Supported on Web

Feature Notes
MP4 playback Works via the browser's native <video> element
Network HLS (.m3u8) Works on Safari; other browsers need hls.js (V2 roadmap)
Asset sources Works
Play / pause / seek / volume / speed Works
Subtitles (WebVTT) Works — http package is Web-compatible
Quality selector Works — each quality is a separate MP4 URL
Reels Works
Retry / error overlay Works
Lifecycle (background/foreground) Works via WidgetsBindingObserver
Fullscreen route Works via Navigator push — SystemChrome calls are no-ops on Web
Orientation lock No-op on Web (guarded by kIsWeb); no crash
Wakelock wakelock_plus silently no-ops on Web; no crash

Not Supported on Web

Feature Behaviour Error type
File / offline sources Returns a typed error immediately; playback does not start FlexVideoErrorType.webUnsupported
Screen protection All calls are no-ops (kIsWeb guard in service); no crash, no events
HLS on Chrome / Firefox The <video> element rejects M3U8 — propagates as a platform error FlexVideoErrorType.platform
FLAG_SECURE Android-only OS feature; not applicable on Web

Handling Web-Unsupported Errors

FlexVideoErrorType.webUnsupported is non-retryable — the retry button is hidden and auto-retry is suppressed automatically.

FlexVideoPlayer(
  controller: controller,
  onError: (error) {
    if (error.type == FlexVideoErrorType.webUnsupported) {
      // show a "feature not available on Web" message
    }
  },
);

HLS Browser Matrix

Browser HLS native support V1 recommendation
Safari (macOS / iOS) ✅ Native Use HLS .m3u8 directly
Chrome Provide MP4 via FlexVideoQuality
Firefox Provide MP4 via FlexVideoQuality
Edge Provide MP4 via FlexVideoQuality

For cross-browser support, supply multiple FlexVideoQuality entries (MP4 at different resolutions) and let the user or your app select the appropriate one.

Roadmap

See CHANGELOG.md for released changes.

Planned for future versions: native Media3 adapter, AVPlayer advanced adapter, DRM, offline downloads, Chromecast, AirPlay, Picture-in-Picture, hls.js for Web.

License

MIT

Libraries

flex_video_player