NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4165 most downloaded on pub.dev
Advanced video player for Flutter with HLS, DASH, DRM, subtitles, caching, PiP, playlists, and custom controls.
Last release 5 days ago
03 Oct 2026
Ships unpredictably
gaps range from 8 days to 2.1 years
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
127 releases · first in 2020
Updated: Defaulted controls to desktop theme and synchronized with core player 1.22.0.
better_player_macosbetter_player.ttml, .dfxp, .xml) subtitle format support across file, network, memory sources, and DASH manifests with style inheritance, colors, regions, and frame rate calculation (#1213).better_player_macos to ^1.1.0 with desktop controls integration.feat(windows): scaffold better_player_windows package by @jhomlala in #1583
Full Changelog: 1.20.0...1.21.0
One column per quarter.
libmpv with software rendering via federated package better_player_windows.PlayerTheme.desktop.Added: Initial release of better_player_macos with native AVPlayer playback, AppKitView rendering, FFI bindings, and FairPlay DRM support.
better_player_macosbetter_player_macos with native AVPlayer playback, AppKitView rendering, FFI bindings, and FairPlay DRM support.better_playerbetter_player_macos.pause in BetterPlayerController.dispose, and guarded BetterPlayerListVideoPlayerController against calling seekTo or play before initialization completes.fix: port community PR fixes ( #866 , #872 , #990 , #1041 , #1135 , #1206 ) …
<AdaptationSet> nodes that specify contentType or child <Representation> mimeType instead of an <AdaptationSet> mimeType attribute, and kept manifest audio tracks selected when language is omitted (#872) (by @rounce).enterFullScreen when already in fullscreen and restored controls visibility on AppLifecycleState.resumed when returning from Picture-in-Picture on Android (#866) (by @aeonmine).better_player_platform_interface
better_player_platform_interfaceDurationRange.startFraction and DurationRange.endFraction against zero or negative durations to prevent NaN/Infinity exceptions.better_player_androidpackageManager.getLaunchIntentForPackage by default and supported fully qualified activityName values (#1138).file:// URIs and proper bitmap bounds sampling when loading local notification images in ImageWorker (#883).sendBufferingUpdate emission during position polling and playback readiness so buffered progress updates on the seekbar.better_player_iosappliesMediaSelectionCriteriaAutomatically = false) on AVPlayer to prevent duplicate subtitles on iOS (#1103).better_player_webbetter_player_platform_interface version bump.better_playersetPlayerSubtitlesConfiguration on BetterPlayerController to dynamically update subtitle styling at runtime (#1141).NaN and Infinity errors in progress bars and aspect ratio calculations when media duration or size is zero (#1157, #1044, #901, #884).BetterPlayerPlaylistController (#1037).playerVisibilityChangedBehavior callback even when handleLifecycle is false (#939).setPlayerControlsConfiguration is called (#1000).Uri.resolve and forwarded data source headers when fetching HLS subtitle playlists (#992).controlsConfiguration.backgroundColor to the fullscreen Scaffold in PlayerFullScreenVideo (#1054).PlayerEventType.exception when runtime errors occur on the video event stream after initialization (#1014).asmsTrackNames in the quality selection menu when the Auto track is present (#1352).PlayerWebControls from triggering the video area's double-tap fullscreen gesture, and ensured PlayerWebControls acquires keyboard focus for shortcuts.PlayerEngineController against post-dispose platform calls and ValueNotifier updates when disposed mid-initialization, and prevented duplicate event listeners on BetterPlayerPlaylistController.setupDataSourceList.PlayerEngineController.seekTo when already playing so the seekbar continues advancing after skip forward/backward or tap-to-seek.PlayerSubtitlesDrawer when controls are visible so subtitles do not overlap the bottom control bar, and preserved zero-based WebVTT cues when X-TIMESTAMP-MAP specifies LOCAL:00:00:00.000.PlayerControllerEvent.setupDataSource fires after setup completes, preventing the video texture from staying hidden on initial autoPlay.[BREAKING_CHANGE] Updated: Standardized class and file naming by replacing the BetterPlayer prefix with Player across internal widgets and utilities (
better_playerBetterPlayer prefix with Player across internal widgets and utilities (including exported PlayerAsmsUtils and PlayerUiUtils; automatable via dart fix --apply).Added: Bundled better_player-usage Dart package skill ( skills/better_player-usage/ ) with 1.x setup, controls, DRM, subtitles, caching, playlist, and
better_player-usage Dart package skill (skills/better_player-usage/) with 1.x setup, controls, DRM, subtitles, caching, playlist, and migration references for AI coding agents.setupDataSource call is superseded by a newer data source, and added semantics container/identifier to BetterPlayerWebErrorWidget.Fixed: Modernized iOS Cupertino controls UI styling and scrubber ergonomics.
better_player_iosbetter_playerFixed: Resolved various documentation inconsistencies where properties were either missing, misassigned, or misspelled across general_configuration.md
better_playergeneral_configuration.md, controls_configuration.md, data_source_configuration.md, and subtitles_configuration.md.Fixed: Resolved Android cache clearing failure and OutOfMemory bugs by properly delegating clearCache() to ExoPlayer's SimpleCache.removeResource() .
better_player_androidclearCache() to ExoPlayer's SimpleCache.removeResource().enterPictureInPictureMode to prevent crashes when the activity is not in a valid state for PiP.better_player_iosmp4 in CacheManager for streams with unknown extensions.NSError details in FlutterError payload for AVPlayerItem failures.better_playerenableReplay to BetterPlayerControlsConfiguration to allow hiding the replay button when a video finishes.startAt configuration on Android when showNotification is enabled (#1024).PlayerEventType.pipStart and PlayerEventType.pipStop) are now properly emitted on Android when PiP is toggled programmatically via enablePictureInPicture and disablePictureInPicture.PlayerEngineController was used after being disposed by aborting background initialization when the controller is destroyed.better_player_platform_interface
better_player_platform_interfacebetter_player_androidsetVideoChangeFrameRateStrategy.better_player_ios.timeDomain pitch algorithm.better_player_webbetter_playerPlayerControlsConfiguration.playbackSpeeds (defaults to 0.25 - 2.0).BetterPlayerController.setAndroidMatchFrameRate(bool).playPreviousVideo() method to BetterPlayerController and BetterPlayerPlaylistController to support playlist backward navigation.BetterPlayerController.currentVideoSize getter to retrieve the runtime dimensions of the currently playing stream rendition.PlayerLogger to include textureId in logs, facilitating better debugging for multi-player scenarios.Added: Supported RTSP streaming on Android via androidx.media3:media3-exoplayer-rtsp .
better_player_androidandroidx.media3:media3-exoplayer-rtsp.better_playerandroidx.media3:media3-exoplayer-rtsp.rtsp_page.dart example to fix compilation errors.pubspec.yaml descriptions and topics across all packages for better pub.dev discoverability.README.md and documentation to include AI agent guidelines, llms.txt, and competitor comparisons.changedPlaylistItem event on playlist video change.setResolution() by sequencing setupDataSource controller events.controlsHideTime not respected in Material and Cupertino controls (#1278).metadataReady event to signal when all adaptive tracks and subtitles are fully parsed and available (#1370).onDoubleTap in player controls to eliminate the 300ms single-tap lag when no custom double-tap gesture is provided.controlsHideTime) and transition animation duration (controlsTransitionTime) to prevent instantaneous hiding of controls.Added: WebVTT metadata block parsing support for NOTE , STYLE , and REGION headers.
better_playerNOTE, STYLE, and REGION headers.X-TIMESTAMP-MAP blocks with 33-bit MPEG-TS rollover timing adjustment corrections.align:left, align:right, align:center).RichText stacks.better_player_platform_interface
better_player_platform_interfacebetter_player_androidbetter_player_iosbetter_player_webbetter_playeroverflowMenuCancelLabel, overflowMenuScrimLabel, and overflowMenuScrimHint to PlayerTranslations for better localization of menu actions.better_player_platform_interface (1.3.1)
chore: bump version to 1.8.0 and update dependencies
chore: bump version to 1.8.0 and update dependencies (#1514)
PlayerDataSource.drmSecurityLevel configuration for Android and Web.customControlsBuilder requires playerTheme to be set to PlayerTheme.custom.better_player_android, better_player_ios, better_player_platform_interface, and better_player_web.drmSecurityLevel to DrmConfiguration to support Widevine L1 on Android and video robustness on Web.androidx.media3 version from 1.1.1 to 1.11.0.minSdkVersion to 24.androidx.media:media to 1.7.0.sessionCompatToken) introduced in the Media3 upgrade.drmSecurityLevel to enable Widevine L1 playback.drmSecurityLevel mapping to Shaka Player's videoRobustness.chore: add missing LICENSE to better_player_web package by @jhomlala in #1502
Full Changelog: 1.6.0...1.7.0
PlayerEngineController from dart:io. setFileDataSource now accepts a String filePath instead of a File object.dart:io imports that prevented web compilation.Feat/better player web by @jhomlala in #1499
Shaka Player.e2e directory and updated all configuration and workflow paths.BetterPlayerAsmsUtils, PlayerSubtitlesFactory, and BetterPlayerHlsUtils network test failures by adding injectable http.Client for testing.better_player_cupertino_controls_test.dart failure by using proper widget interaction and pumping.Feat/cupertino controls fixes by @jhomlala in #1498
chore: refactor widget helper methods to comply with project standards by @jhomlala in #1496
Full Changelog: 1.4.0...1.5.0
BetterPlayerController by segregating internal state variables into immutable data classes (PlayerViewState, PlayerSubtitleState, PlayerTrackState, PlayerPlaybackState), improving architectural scalability.Widget _build...()) into inline Builder patterns and proper StatelessWidget classes to strictly comply with project standards, specifically across UI controls, route builders, and example apps.PlayerEventConstants and exported them in the main library interface for easier external subscription handling.Feat/add examples to packages by @jhomlala in #1492
fix_data.yaml for deprecated VideoPlayerController types.README.md files.videoPlayerValue in progress bars during drag and tap gestures.Docs/documentation audit by @jhomlala in #1489
PlayerLogger, featuring native-to-Dart log streaming, automatic caller/tag derivation, and comprehensive internal logs.fix: refactor by @jhomlala in #1488
Full Changelog: 1.1.1...1.2.0
seekTo in BetterPlayerController and VideoPlayerController to prevent crashes when called before full initialization.VideoPlayerController to use event stream for initialization tracking, improving robustness and fixing race conditions during data source setup.VideoPlayerController where error descriptions were not correctly assigned to the player state.chore: prepare 1.1.1 release and fix pub score by @jhomlala in #1486
Full Changelog: 1.1.0...1.1.1
fix_data.yaml syntax error preventing downgrade analysis.[!code focus] annotations from migration docs.Refactor: Unified model names by removing 'Better' prefix.
Feat/decouple example by @jhomlala in #1484
Full Changelog : 1.0.0...1.0.0
Full Changelog: 1.0.0...1.0.0
better_player_android and better_player_ios.better_player_platform_interface (e.g., deleted PlayerDataSourceType, renamed BetterPlayerUtils to BetterPlayerUiUtils).isPictureInPictureEnabled to isPictureInPictureSupported across the platform interface and core controller.Added: Semantic identifiers across player controls, UI components, and resolution selection items for robust E2E testing.
docs: mark Swift and SPM migrations as breaking changes by @jhomlala in #1467
Full Changelog: 0.7.1...0.8.0
fix: embedded HLS subtitles rendering by correcting segment timing and JIT loading logic by @jhomlala in #1455
Full Changelog: 0.7.0...0.7.1
assets/media/.fix: dynamic resolution resizing for adaptive streams and update example app by @jhomlala in #1450
Full Changelog: 0.6.1...0.7.0
changedSize event for both Android and iOS to update player dimensions during playback, fixing the issue where video container does not resize when resolution changes dynamically.fix(android): duration reports zero for VOD streams when ExoPlayer resolves it after STATE_READY by @jhomlala with @Copilot in #1439
Full Changelog: 0.6.0...0.6.1
OrientationBuilder.assets/media/ and added assets/pub/ for pub.dev screenshots and logo.C.TIME_UNSET value and delaying the initialized event until a valid duration is available via onTimelineChanged.Change Android package name and namespace to pl.hasoft.better_player by @jhomlala in #1441
Full Changelog: 0.5.0...0.6.0
pl.hasoft.better_player.video_player and chewie to better_player.Refactor: Replace helper build methods with dedicated Widget classes by @jhomlala in #1440
Full Changelog: 0.4.3...0.5.0
_buildWidget()) were replaced with dedicated Flutter Widget classes for improved modularity, performance, and maintainability.Fix/doc typos grammar by @jhomlala in #1437
Full Changelog: 0.4.2...0.4.3
docsify-plugin-flexible-alerts plugin.* Migrate to Built-in Kotlin and bump version to 0.4.0
Update example app with stable video URLs
Update example app with stable video URLs (#1430)
* Update example app with stable video URLs and bump version to 0.2.2
* Add GlobalCupertinoLocalizations delegate to fix pl_PL support warning
* Fix localization support for pl_PL by using GlobalMaterialLocalizations.delegates from flutter_localizations
* Fix localization issue by using standard MaterialApp and combining delegates from flutter_localizations and material_ui
* Update AGENTS.md: Specify that tags must not use 'v' prefix
* Restore full CHANGELOG.md history and organize new fixes under Unreleased
* Update AGENTS.md with Proactive Refactoring rule
* Update AGENTS.md: include iOS in proactive refactoring standards
* Update example app name to 'Better Player Example'
* Re-update example constants with stable URLs and improved subtitles
* Fix 403 error by reverting to commondatastorage.googleapis.com for GTV samples
* Update CHANGELOG with 403 fix
* Revert version bump to 0.4.0 and move fixes to Unreleased section
* Update AGENTS.md with rules against unilateral versioning and troubleshooting tips
* Replace Big Buck Bunny URL with reliable jsDelivr CDN link
* Consolidate changelog entries and update AGENTS.md guidelines
* Update elephantDreamVideoUrl to reliable jsDelivr CDN link
* Update elephantDreamVideoUrl with a working Elephants Dream video from Xiph.org
* Update elephantDreamVideoUrl with a stable link from Archive.org
* Update Event Listener and Controls Configuration pages to use reliable Big Buck Bunny URL
* Update resolutions example to use stable MP4 URLs for quality switching
* Consolidate changelog and update playlist with reliable videos
* Update video list and elephant dream constant with reliable CDN link
* Remove troubleshooting section from AGENTS.md
* Update example video URLs with stable lorem.video sources
* Fix auto fullscreen orientation example by adding truly vertical video and triggering fullscreen on button tap
* Fix layout overflow in auto fullscreen orientation example by wrapping in SingleChildScrollView
* Update vertical and horizontal video URLs for auto fullscreen orientation example
* Update vertical video URL to a stable GitHub source
* Enable Picture-in-Picture support in AndroidManifest.xml
* Fix layout overflow in Picture-in-Picture example by wrapping in SingleChildScrollView
* Fix disablePictureInPicture on Android: restore activity to front instead of moving task to back
* Revert PiP restoration logic and add check for active PiP mode in enablePictureInPicture
* Add PiP active check to disablePictureInPicture on Android
* Update DRM test streams with stable working mirrors for Widevine and FairPlay
* Update dashStreamUrl with a reliable DASH test stream from Shaka Demo assets
* Update dashStreamUrl with a comprehensive DASH-IF test stream (Multi-Audio/Video/Subs)
* Update AGENTS.md: Always run format and analyze in both root and example directories
* Revert version to 0.4.0, update install docs, and finalize PiP and DRM fixes
[BREAKING_CHANGE] Added: Support for Built-in Kotlin.
[BREAKING_CHANGE] Migrated to Flutter 3.47.0.
material_ui and cupertino_ui packages.compileSdkVersion to 36 in Android.Added: .pubignore to exclude media/ and AGENTS.md from the published package.
.pubignore to exclude media/ and AGENTS.md from the published package.README.md to remove outdated migration information.prefer_if_elements_to_conditional_expressions lint warnings in Material controls.[BREAKING_CHANGE] Updated: iOS to Swift Package Manager (SPM). Native source files moved from ios/Classes to ios/better_player/Sources.
ios/Classes to ios/better_player/Sources.build.gradle using the plugins {} block. Removed legacy kotlin-android apply plugin.very_good_analysis to 10.3.0 and addressed new linting rules.xml dependency to 7.0.0.meta dependency to 1.18.0.[BREAKING_CHANGE] Updated: Android playback engine from ExoPlayer 2 to AndroidX Media3 (1.1.1).
very_good_analysis (VGV).[BREAKING_CHANGE] Updated min. Flutter version to 3.3.0 and min. Dart version to 3.0.0.
* Updated dependencies * Fixed Flutter 3.0 issues
Updated ExoPlayer version to 2.17.1.
Fixed full screen button padding in material controls.
setBetterPlayerControlsConfiguration in BetterPlayerController.setOverriddenFit in BetterPlayerController.setPlayerControlsConfiguration in BetterPlayerController.setOverriddenFit in BetterPlayerController.Fixed deprecated jCenter. Replaced jCenter with mavenCentral (by https://github.com/petoknm)
* Fixed kotlin version issue.
[BREAKING_CHANGE] Split controlsHidden into controlsHiddenStart and controlsHiddenEnd.
Fixed full screen safe area issue in cupertino controls.
[BREAKING_CHANGE] Changed min required iOS version to 11.
BetterPlayerConfiguration copyWith method.useRootNavigator option to BetterPlayerConfiguration.PlayerConfiguration copyWith method.useRootNavigator option to PlayerConfiguration.* Fixed iOS build issue.
[BREAKING_CHANGE] nextVideoTimeStreamController is now marked as private. Please use nextVideoTimeStream to access stream.
nextVideoTimeStreamController is now marked as private. Please use nextVideoTimeStream to access stream.sigmaX and sigmaY parameters from BetterPlayerControlsConfiguration.expandToFill in BetterPlayerConfiguration.BetterPlayerControlsConfiguration.theme factory for BetterPlayerControlsConfiguration.BetterPlayerControlsState.preCache and stopPreCache for iOS.nextVideoTimeStreamController is now marked as private. Please use nextVideoTimeStream to access stream.sigmaX and sigmaY parameters from PlayerControlsConfiguration.expandToFill in PlayerConfiguration.PlayerControlsConfiguration.theme factory for PlayerControlsConfiguration.BetterPlayerControlsState.preCache and stopPreCache for iOS.Added licenseUrl support for iOS DRM.
licenseUrl support for iOS DRM.renderedSubtitle in BetterPlayerController.postControllerEvent to handle scenario where event stream is closed.bufferingUpdate event triggered too often.setMixWithOthers method in BetterPlayerListVideoPlayerController.sigmaX and sigmaY parameters in BetterPlayerControlsConfiguration to control blur of cupertino controls (original idea by: https://github.com/YeFei572)* Updated ExoPlayer version
Fixed play after seeking issue on iOS.
BetterPlayerMultipleGestureDetector to handle problems with gesture detectioneventListeners in BetterPlayerController (by https://github.com/Letalus)Fixed file data source exception. Right now user will be only warned.
overriddenDuration behavior in iOS when passed overriddenDuration is longer than video duration.certificateUrl parameter in BetterPlayerDrmConfiguration.bufferingConfiguration parameter in BetterPlayerConfiguration which contains buffering settings.Added file check for file data source.
Added support for segmented subtitles.
asmsIsSegmented, asmsSegmentsTime and asmsSegments. These fields shouldn't be configured
manually.Added support for DASH adaptive stream subtitles, audio tracks, tracks (by https://github.com/adrianByv)
Your coding agent can read these notes before it upgrades. Set up the MCP server →