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 • Migrating from video_player • Migrating from chewie • 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 SRT, WebVTT, TTML SRT only Advanced
Picture in Picture (PiP) Built-in None Platform-dependent
Playlists Built-in None Built-in

📱 Visual Showcase

Default Controls Settings Menu Audio Tracks Event Listener

📦 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 →

Libraries

better_player