better_player 1.26.0 copy "better_player: ^1.26.0" to clipboard
better_player: ^1.26.0 copied to clipboard

Advanced video player for Flutter with HLS, DASH, DRM, subtitles, caching, PiP, playlists, and custom controls.

Better Player Logo

Better Player #

The complete, production-grade video player for Flutter.
One unified controller. Native performance. Zero bloated binaries.

Pub Version Pub Points Pub Likes GitHub Stars License

Documentation • Live Demo • Migrating from video_player • Migrating from chewie • Migrating from media_kit • Example App


Why Better Player? #

Stop stitching video_player, separate UI packages, abandoned caching plugins, and custom DRM code together. Better Player packs the full video stack into a single, cohesive engine.

Feature Better Player video_player + chewie media_kit
App Size Overhead ~1-2 MB (Native OS engines) ~1-2 MB +30MB to 50MB (Bundled mpv binaries)
Out-of-the-box UI Built-in & customizable Chewie required Built-in
HLS / DASH Full native support Basic Native
DRM (Widevine / FairPlay) Native support None None
Smart Caching Built-in offline cache None (3rd party needed) None
Subtitles & Closed Captions SRT, WebVTT, TTML, CEA-608 / CEA-708 SRT only Advanced
Picture in Picture (PiP) Built-in None Platform-dependent
Playlists Built-in None Built-in
VAST / VMAP Ads Client-side ad engine (VAST 2.0-4.x, VMAP) None None
Video Feeds & Pooling Built-in (BetterPlayerFeed, BetterPlayerPool) None None

📱 Visual Showcase #

Better Player Android Mobile Showcase
Mobile Overview
Picture in Picture
Native Picture-in-Picture (PiP)
Better Player Web and Desktop Showcase
Web & Desktop Overview
Touch & Fullscreen Controls
Touch & Fullscreen Controls
Adaptive HLS Quality Switching
Adaptive HLS Quality & Track Switching
Advanced Subtitles
Styled Subtitles (WebVTT, TTML, SRT)

📦 Quick Start #

1. Install #

flutter pub add better_player

2. Basic Playback #

Play a network video with full controls in three lines:

import 'package:better_player/better_player.dart';

AspectRatio(
  aspectRatio: 16 / 9,
  child: BetterPlayer.network(
    "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
  ),
)

3. Production Playback (Caching, DRM & HLS) #

Configure caching, custom headers, or DRM with a single controller:

final controller = BetterPlayerController(
  const PlayerConfiguration(
    aspectRatio: 16 / 9,
    autoPlay: true,
  ),
  betterPlayerDataSource: PlayerDataSource(
    DataSourceType.network,
    "https://example.com/stream.m3u8",
    // Cache video locally for instant playback:
    cacheConfiguration: const CacheConfiguration(useCache: true),
    // Or protect content with DRM:
    drmConfiguration: DrmConfiguration(
      drmType: DrmType.widevine,
      licenseUrl: "https://license.example.com",
    ),
  ),
);

BetterPlayer(controller: controller);

🌐 Platform Packages #

Better Player uses a federated architecture. Each platform runs on its native, hardware-accelerated media engine:

Platform Package Engine Status
Android better_player_android Google Media3 / ExoPlayer pub
iOS better_player_ios Apple AVPlayer pub
macOS better_player_macos Apple AVPlayer pub
Web better_player_web Shaka Player / HTML5 pub
Windows better_player_windows libmpv pub

🔄 Migration Guides #

Switching from another package? Follow the step-by-step migration guides:


🤖 AI Coding Agents #

Better Player supports Dart package skills so tools like Cursor, Claude Code, Gemini, and Copilot understand the API out of the box:

dart run skills@ get -p better_player

📖 Resources & Docs #


🤝 Contributing #

Found a bug or missing a feature? Open an issue or submit a pull request.

💼 Enterprise Support #

Need a custom video source adapter, bespoke DRM implementation, or tailored UI controls? I am available for consulting.

Contact on LinkedIn →