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

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

Better Player #

pub package pub package pub package

Better Player handles the complex video playback edge cases so you don't have to. Originally based on video_player, it's now fully independent. It tackles HLS, DRM, and caching out of the box.

[IMPORTANT] Migrating from 0.0.84 to 1.x.x? See the Migration Guides section below.


πŸ“± Visual Showcase #

Default Controls Settings Menu Audio Tracks Event Listener

πŸ† vs Competitors #

Why choose Better Player? Here is how it stacks up against the alternatives.

Feature Better Player video_player chewie media_kit
Engine ExoPlayer/AVPlayer/Shaka ExoPlayer/AVPlayer video_player libmpv
UI Controls βœ… Built-in & Customizable ❌ None βœ… Built-in βœ… Built-in
HLS / DASH βœ… Native ⚠️ Basic ⚠️ Basic βœ… Native
DRM Support βœ… Widevine/FairPlay/ClearKey ❌ None ❌ None ❌ None
Subtitles βœ… Advanced (WebVTT, HTML, SRT) ⚠️ Basic (SRT only) ⚠️ Basic βœ… Advanced
Caching βœ… Built-in ❌ None ❌ None ❌ None
Playlists βœ… Built-in ❌ None ❌ None βœ… Built-in

πŸš€ Key Features #

  • Adaptive Streaming: Play HLS, DASH, and Smooth Streaming with automatic track selection.
  • DRM Support: Protect your content with Widevine, FairPlay, and ClearKey.
  • Smart Caching: Cache videos for seamless offline playback.
  • Picture in Picture (PiP): Keep videos playing while users multitask.
  • Advanced Subtitles: Parse SRT and WebVTT, including HTML tags.

πŸ“¦ Quick Start #

1. Add dependency #

Add Better Player to your pubspec.yaml:

dependencies:
  better_player: ^1.10.0

2. Basic Usage #

Use the network factory to get a player up and running fast.

import 'package:better_player/better_player.dart';

// Inside your build method
AspectRatio(
  aspectRatio: 16 / 9,
  child: BetterPlayer.network(
    "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
    betterPlayerConfiguration: PlayerConfiguration(
      aspectRatio: 16 / 9,
      looping: true,
      autoPlay: true,
    ),
  ),
)

3. Advanced Controller Usage #

Need full control? Initialize a BetterPlayerController manually.

BetterPlayerController _controller = BetterPlayerController(
    const PlayerConfiguration(),
    betterPlayerDataSource: PlayerDataSource(
        DataSourceType.network,
        "https://example.com/video.mp4",
    ),
);

BetterPlayer(controller: _controller)

πŸ€– AI Agent Quick Reference #

Writing a script or prompt? Feed this to your AI to get the right code on the first try.

  • Initialization: Always initialize BetterPlayerController in initState() with a PlayerConfiguration and PlayerDataSource.
  • Core Classes:
    • BetterPlayerController: Manages state and configuration.
    • PlayerDataSource: Wraps video URL, DRM config, subtitles, headers.
    • PlayerConfiguration: UI, looping, autoPlay, aspect ratio.
    • PlayerControlsConfiguration: Colors, icons, padding for the control bar.
  • Subtitles: Pass PlayerSubtitlesSource directly into PlayerDataSource.
  • Disposal: Default is autoDispose: true. Avoid manual controller.dispose() unless you opt out.

πŸ”„ Migration Guides #

Moving from another package? Follow these guides:


πŸ“– Resources #


🀝 Contributing #

Bugs? Feature requests? Open an issue. Better yet, submit a PR.

πŸ’Ό Enterprise Support #

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

Let's talk on LinkedIn β†’