omni_video_player 6.0.9 copy "omni_video_player: ^6.0.9" to clipboard
omni_video_player: ^6.0.9 copied to clipboard

A Flutter widget for playing videos from YouTube, Vimeo, assets, and network sources — fully customizable and easy to integrate.

6.0.9 #

🐛 Fixes

  • While loading, a custom thumbnail keeps its own proportions instead of a 16/9 box that cropped portrait videos.

6.0.8 #

⬆️ Update documentation

  • The README's standard example now compiles: it passes configuration and callbacks, which OmniVideoPlayer requires.

6.0.7 #

✨ New Features

  • The route fullscreen pushes to own pop and the back button can now be named, via PlayerUIVisibilityOptions.fullscreenRouteSettings. A NavigatorObserver of the app can then tell that route apart from a page of its own — to leave an overlay of its own open while fullscreen is up, for instance.

6.0.6 #

🐛 Fixes

  • Sending one player fullscreen released every other player on the page: the fullscreen covers them, so they read as scrolled off-screen. They are now left alone while a fullscreen of ours is open, instead of coming back seconds later on a new controller.
  • A player coming back on a new controller left the play/pause button listening to the old one: the icon stayed on play while the video ran, and only caught up once the controls were hidden and shown again.
  • A controller disposed while its widgets were still mounted threw used after being disposed on the next rebuild, and the broken frame left the layout stuck. Listeners and notifications are now swallowed once a controller is disposed.

6.0.5 #

🐛 Fixes

  • Fullscreen is now hoisted above the route stack for a player inside a page too, so an OverlayEntry the app put over it — a tutorial bubble, a banner, a PiP — no longer covers it.
  • The fullscreen page keeps the themes around the player, its own among them.

6.0.4 #

🐛 Fixes

  • Fullscreen on the WebView players (YouTube, Vimeo) tore the webview down and reloaded the video, a regression of 6.0.3.

6.0.3 #

🐛 Fixes

  • Fullscreen now paints above any OverlayEntry the app inserted over the route stack, so a player living in one no longer shows its old controls through fullscreen.

6.0.2 #

🐛 Fixes

  • A player placed outside a ModalRoute — in an OverlayEntry above the page, for instance — crashed on build with Null check operator used on a null value.

6.0.1 #

🐛 Fixes

  • enableZoom works again, and now also on the WebView players (YouTube live, Vimeo) (#85).

6.0.0 #

⚠️ Breaking changes

  • OmniPlaybackController.dispose() now returns Future<void>. Await it when you need the video's resources freed before doing something else, such as opening a camera. Custom implementations must change their signature.
  • On Android only one video plays at a time, muted or not. On iOS and web muted videos still play together.
  • On Android, a video with sound no longer stops the audio of other apps.
  • CustomPlayerWidgets.loadingWidget now defaults to the player's own loader instead of a plain CircularProgressIndicator.

🐛 Fixes

  • On Android replay() rewound the video but never started it again. It now restarts right away, even on a big 4K video.
  • Dragging the progress bar no longer makes the video jump through every position you pass over.
  • When one video failed, every other player on screen was closed too, and they did not come back. Now only the failing one is affected: it retries, then shows its errorPlaceholder.
  • The spinner shown during a seek now uses your loadingWidget and respects showLoadingWidget. So do the two WebView players and the initial loading state.

🎛️ New

  • isReplaying on the controller: true while the video is restarting. Use it to avoid offering a "tap to restart" on a restart already under way.
  • PlayerUIVisibilityOptions.showSeekingIndicator (default true): hides the seek spinner alone.
  • GlobalPlaybackController is now exported. Call releaseAllResources() on it to give the device's video resources back, before opening a camera for example; the players on screen come back on their own afterwards.

5.1.1 #

🐛 A custom loading widget is no longer letterboxed

  • loadingWidget was boxed into a guessed 16/9 while the aspect ratio was still unknown, so a full-bleed loader came out the wrong shape on a portrait video. It now fills the player until the real ratio is known; a centred spinner is unaffected.

5.1.0 #

🔊 Several muted players at once

  • Muted players no longer pause each other, so a list of short muted loops animates together. Exclusive playback still applies, but only among audible players — a single video with sound is unchanged.
  • The wakelock is held only while a player is audible or fullscreen.

⏱️ "Finished" is now correct, on all four backends

  • isFinished compares durations instead of whole seconds: a 1.96s video no longer reports finished at 1.0s, nor a sub-second one from position zero. A thumbnail therefore stops covering a still-playing video.
  • onFinished fires once per playback at the real end and re-arms, so it can count loops — fullscreen used to fire it twice.

🔈 initialVolume survives

  • No longer overwritten by the shared volume, and starting playback no longer changes it. Omit it to follow the shared volume; hasExplicitVolume tells the two apart.

🐛 Fixes

  • copyWith dropped videoFile, so .file(...).copyWith(...) always crashed on init.
  • YouTube live could hang on the loading spinner when the metadata lookup was blocked.
  • YouTube in WebView could show the replay button instead of play on load, with taps unable to start playback, because the placeholder duration counted as "finished" (#84).

5.0.1 #

🧹 Static analysis

  • Removed an unused catch stack-trace variable so the package passes pub.dev static analysis cleanly.

5.0.0 #

🎛️ YouTube WebView controls — grouped config (BREAKING)

  • YouTube WebView flags moved into VideoSourceConfiguration.youtube(webView: YoutubeWebViewConfiguration(...)):
    • forceWebViewOnly (was forceYoutubeWebViewOnly), enableFallback (was enableYoutubeWebViewFallback).
    • useNativeControls (new, default true): use YouTube's native play/pause + double-tap (our bottom bar stays overlaid). Set false for the previous fully-custom controls.
    • onExternalLink: react to in-player links (Watch on YouTube, title, …) — they're always blocked.

Migration: move forceYoutubeWebViewOnly/enableYoutubeWebViewFallback into webView:; set useNativeControls: false to keep the old custom controls.

🐛 Bug Fixes — playback reliability (#82, #78)

  • Videos now resume correctly after seeking, instead of stalling or getting stuck on an error (#82).
  • YouTube and Vimeo recover on their own from the random "sometimes it plays, sometimes it doesn't" failures — no more restarting the app (#78).
  • Smoother playback, faster loading, and less memory use when videos scroll off screen.
  • YouTube in WebView now loads reliably, no longer pauses itself on the first play, and captions stay off.
  • WebM videos now show the correct duration and progress bar (no more stuck at 00:00 or a permanent replay button).
  • Playlists in fullscreen: fixed the freeze/black screen and the flickering next/previous buttons when changing video.
  • Fullscreen controls now respect the notch / safe area.
  • Text selection inside the video players is disabled.

4.0.2 #

🐛 Bug Fixes — fullscreen orientation (#75)

  • Leaving fullscreen no longer forces all orientations, which previously overrode an app-wide lock such as SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).
  • Added PlayerUIVisibilityOptions.restoreOrientationsAfterFullscreen: set it to your app's orientations (e.g. [DeviceOrientation.portraitUp]) and they are reapplied automatically when the player exits fullscreen.
  • Default is null, which keeps the previous behavior (restore all orientations) — non-breaking.

4.0.1 #

🐛 Bug Fixes — kids/restricted YouTube playback

  • When the androidVr manifest fails (kids/restricted videos), fall back to the default InnerTube clients and keep muxed streams only (~360p), avoiding the HTTP 403 that adaptive video+audio streams return in ExoPlayer for these videos.
  • Skip the "no audio streams" error when the selected muxed stream already includes mp4a audio.
  • Transient/network failures on the androidVr manifest are no longer treated as restricted: they are retried instead of triggering the mux-only fallback, so normal videos are never silently downgraded to 360p on a single network blip.
  • Normal videos are unchanged: androidVr manifest with the existing Android/iOS stream selection (720p+ on Android).

4.0.0 #

🎬 Playlist

  • New OmniVideoPlaylist widget with OmniPlaylistController, PlaylistConfiguration, and PlaylistCallbacks.
  • Plays an ordered queue of videos with on-video previous/next buttons. Optional autoAdvance (advance automatically when a video finishes) and loop (wrap around the ends).
  • Purely additive to single-video behaviour. Also adds value equality to VideoSourceConfiguration.

🎨 Theming (breaking)

  • BREAKING: Renamed VideoPlayerColorScheme.playPauseBackground → controlButtonBackground and playPauseIcon → controlButtonIcon. These colors are shared by the play/pause, replay, loader and skip-indicator buttons, and now the playlist prev/next buttons too. Migration: rename these parameters in your VideoPlayerColorScheme(...) / .copyWith(...) calls.
  • Playlist prev/next buttons are fully themeable, consistent with the other control buttons: colors (controlButtonBackground/controlButtonIcon), icons (VideoPlayerIconTheme.skipPrevious/skipNext), and accessibility labels (VideoPlayerAccessibilityTheme.previousTrackLabel/nextTrackLabel).

3.9.4 #

✨ Stability & Bug Fixes

  • Safe Disposal Handling:
    • Added comprehensive isDisposed guards to all controller setters (volume, duration, playing, etc.) to prevent "ChangeNotifier used after being disposed" crashes during global resource cleanup.
    • Improved GlobalVolumeSynchronizer to safely ignore disposed controllers during global volume updates.
    • Added safety checks for JavaScript evaluation in WebView-based controllers after disposal.

3.9.3 #

✨ New Features & Bug Fixes

  • Improved Resource Management:
    • Added isDisposed check to all controllers to prevent ChangeNotifier errors after disposal.
    • Enhanced OmniVideoPlayerView to safely handle controller disposal and listener removal.
  • Auto-Reinitialization:
    • Added VisibilityDetector to OmniVideoPlayerInitializer to automatically re-initialize players that were disposed or failed when they become visible again.
    • This ensures a seamless user experience when scrolling back to a video after a global memory cleanup.

3.9.2 #

✨ New Features

  • Hardware Decoder Auto-Recovery:
    • Added a global tracking system for OmniPlaybackController instances.
    • Implemented automatic cleanup and retry logic when Android reports NO_MEMORY or CodecException (error 0xfffffff4).
    • Added releaseAllResources() to GlobalPlaybackController to force-dispose all active players in critical memory situations.

3.9.1 #

🛠 Fix

  • Fixed replay race condition on all player types (YouTube, Vimeo, WebM, network).

    • replay() now runs sequentially (pause → seekTo(0) → play) instead of in parallel, preventing the video from stalling at position 0 with the wrong button state.
  • Fixed autoMuteOnStart + autoPlay ignored on Vimeo mobile.

    • play(), mute(), unMute(), and volume setter now use _executeOrQueue so deferred actions are correctly applied once the WebView is ready.
    • Fixed a bug where the volume setter was passing the old value ($volume) instead of the new value ($value) to the JS player.

3.9.0 #

✨ New Features

  • Feat: New interactive Web volume slider (VolumeSliderControl) with hover support.
  • Breaking (Theme): Renamed VideoPlayerOverlayTheme to VideoPlayerBackdropTheme.
  • Theme: Introduced VideoPlayerMenuTheme, menuBorderRadius, volumeSliderThumbShape, and new volume-specific colors in VideoPlayerColorScheme.

3.8.8 #

🛠 Fix

  • resolve autoMuteOnStart ignored
    • See issue: #73

3.8.7 #

🛠 Fix

  • Fixed playback controls visibility and interaction issues on Web.
    • See issue: #70

3.8.6 #

✨ New Features

  • Added activeGradient parameter to VideoPlayerColorScheme into OmniVideoPlayerThemeData

3.8.5 #

🛠 Fix

  • Fixed an error on onSeekRequest

3.8.3 3.8.4 #

🛠 Fix

  • Fixed an error when switching to fullscreen in youtube live video
    • See issue: #72

3.8.2 #

🛠 Fix

  • Fixed an error into build for mobile

3.8.1 #

⬆️ Update documentation

3.8.0 #

✨ New Features

  • Added native HTML iframe support for Vimeo on Flutter Web
    • See issue: #67

3.7.4 #

✨ New Features

  • Added httpHeaders parameter to VideoSourceConfiguration.network()
    • See issue: #68

3.7.3 #

🛠 Fix

  • Fixed an issue where YouTube live videos were failing to play.
    • See issue: #66

3.7.2 #

🛠 Fix

  • Fixed minor bugs

3.7.1 #

✨ New Features

  • Added autoFullScreenAtStart parameter to VideoSourceConfiguration.
    • This flag controls whether the video should automatically switch to fullscreen mode as soon as the player initialization is complete.
    • Default: false.

3.7.0 #

🛠 Fix

  • Fixed audio-video synchronization issues for YouTube videos.
    • Resolved desynchronization occurring when seeking or changing playback speed.
    • See issue: #64

3.6.0 #

✨ New Features

  • Added pauseWhenOutOfView parameter to VideoSourceConfiguration.
    • This flag controls whether the video should automatically pause when the player is scrolled out of the viewport or is no longer visible.
    • Default: true (the video will pause when it leaves the view).

3.5.3 #

⬆️ Update documentation

3.5.2 #

🛠 Fix

  • Fixed network http player bug with duration
    • See issue: #56

3.5.0 3.5.1 #

  • Fixed minor bugs on YouTube Webview isFinished
  • Add support to webm on iOS (with a WebView)

3.4.5 #

  • Fixed minor bugs:
    • Resolved video/audio desynchronization when using seekTo
    • Improved WebView rendering performance

3.4.4 #

🛠 Fix

  • Fixed vimeo player bug
    • See issue: #54

3.4.3 3.4.2 #

⬆️ Updates pub.dev page

3.4.1 3.4.1-beta #

✨ New Features

  • Added new enableZoom parameter in PlayerUIVisibilityOptions to allow pinch-to-zoom gestures on the video player (default: false).
  • Fixed some minor bugs

3.3.23 3.3.14 #

🛠 Fix

  • Fixed some minor bugs

3.3.13 #

🛠 Fix

  • Fixed the issue where unlisted YouTube videos kept loading.

    • See issue: #50

3.3.12 3.3.6 #

✨ New Features

  • Added new fitVideoToBounds parameter in PlayerUIVisibilityOptions to control whether the video fills the available area (default: true).

🛠 Fix

  • Minor stability and UI fixes.

3.3.5 3.3.5-beta #

✨ New Features

  • Added scrubbing thumbnail preview in the video player UI.

    • Introduced a new showScrubbingThumbnailPreview parameter in PlayerUIVisibilityOptions.
    • This parameter allows developers to enable or disable the small preview thumbnail that appears when dragging the seek bar.
    • Default value is true, ensuring the preview is shown unless explicitly turned off.

3.3.4 3.3.4-beta #

⬆️ Updates dependencies

  • Updated all dependencies.

3.3.3-beta #

⚡ Replaced video_player with media_kit · Faster playback

  • Replaced the underlying video_player package with media_kit for native video playback.
  • Significantly faster video loading on iOS and Android.
  • Resolves the iOS video_player issue of preloading the entire video (see flutter/flutter#126760).
  • Improved support for multiple resolutions.
  • Note: Audio does not work on the iOS Simulator, works on real devices and android Simulator.

3.3.3 #

⬆️ Updates dependencies · Improvement

  • Updated all dependencies.
  • Improved YouTube WebView player and removed all YouTube branding.

3.3.2 #

🛠 Fix

  • Fixed orientation and fullscreen exit issues on Android and iOS.

    • App no longer remains stuck in landscape mode after closing fullscreen.
    • See issue: #9

3.3.1 #

🛠 Fix

  • Fixed autoplay not working issue on Web.
    • See issue: #46
  • Removed white border appearing on top and left sides in Web player.
    • See issue: #47

3.3.0 #

🛠 Bug Fixes · Renaming · Code Refactor

  • Fixed several minor bugs improving playback stability and UI consistency.
  • Thanks to @Md-Sifatullah617 for contributing a fix to one of the issues. 🙌
  • The parameter options in OmniVideoPlayer has been renamed to configuration for clarity.

3.2.2 #

⬆️ Updates dependencies

3.2.1 3.2.0 #

🛠 Refactor / Improvement

  • Reduced reliance on external libraries (from 5 libraries for web view management) and refactored to use the new flutter_inappwebview dependency.

3.1.11 3.1.10 #

✨ New Features

  • Enhanced accessibility throughout the OmniVideoPlayer.

    • The video player has been made fully accessible, ensuring it can be properly used by visually impaired users.
    • Introduced a new VideoPlayerAccessibilityTheme parameter in OmniVideoPlayerThemeData, allowing developers to customize semantic labels and accessibility messages for all player controls and overlays.

3.1.9 #

🛠 Fix

  • Fixed YouTube WebView playback issue
    • See issue: #37

3.1.8 #

🛠 Fix

  • Improved video startup performance for long videos on iOS.
    • See issue: #37
    • See issue: #40

3.1.7 #

🛠 Fix

  • Fixed issue with exiting fullscreen in release mode.
    • See issue: #38

3.1.6 #

🛠 Fix

  • Fixed several minor issues in the player related to video controller management and playback of certain network sources.
  • Removed the refreshOnUrlReuse parameter, which is no longer valid and no longer used by the player.

3.1.5 #

✨ New Features

  • Added refreshOnUrlReuse parameter to VideoSourceConfiguration.network.

    • When set to true, the player will always create a new controller even if a controller for the same videoUrl already exists in cache.
    • This is particularly useful when working with temporary or expiring network URLs (e.g., signed or tokenized URLs) that may return HTTP 400/403 errors if reused.
    • Default: false

3.1.4 3.1.0 #

🛠 Fix

  • Fixed minor playback issues
  • Removed a package dependency to reduce overall bundle size.
  • Added automatic retry logic when entering an error state — the player now retries initialization up to 3 times before failing definitively.

3.0.21 #

✨ New Features

  • Added showBottomControlsBarOnPause parameter to PlayerUIVisibilityOptions.

    • When set to true, the bottom control bar remains visible while the video is paused, providing easier access to playback controls during pause state.
    • Default: false

3.0.20 #

✨ New Features

  • Added alwaysShowBottomControlsBar parameter to PlayerUIVisibilityOptions.

    • When set to true, the bottom control bar is always visible, even when the video is paused or hasn't started yet.
    • Default: false

3.0.19 3.0.13 #

🛠 Refactor / Improvement

  • Added a singleton VideoPlaybackControllerPool to reuse VideoPlaybackController instances.

    • Reuses the existing controller if the requested URI is the same and already initialized.
    • Disposes and recreates the controller only when switching to a new URI or after an initialization failure.
    • Simplifies controller management and reduces unnecessary decoder creation, improving performance and memory usage.

3.0.12 3.0.11 #

🛠 Fix

  • Added automatic retry for VideoPlaybackController initialization.

    • Retries up to 3 times with 250 ms delay between attempts to prevent intermittent OMX.qcom.video.decoder.avc (NO_MEMORY) crashes on some Android devices when switching videos rapidly.

3.0.10 3.0.8 #

✨ New Features

  • Added keepAlive parameter to VideoSourceConfiguration.

    • When set to true, the video controller is not automatically disposed, allowing the video state to persist between rebuilds or navigation changes.
    • Default: false
    • ⚠️ Use with caution — if you never call dispose() manually, this may cause memory leaks or OutOfMemory errors.

🛠 Fix

  • Fixed occasional OMX.qcom.video.decoder.avc (NO_MEMORY) crash on Android.

    • Set mixWithOthers to false in VideoPlaybackController to prevent hardware decoder conflicts when multiple players or audio sessions are active.

3.0.7 3.0.5 #

🛠 Fix / UI

  • Fixed ProgressBar crash in fullscreen.

    • Prevents invalid clamp arguments when video starts or panel layouts reduce available width.

3.0.4 #

🧹 Removals

  • Removed unused parameters in VideoPlayerLabelTheme:
    • openExternalLabel
    • refreshLabel
  • These labels were not used anywhere in the player and have been removed to simplify the API.

3.0.3 #

✨ New Features

  • Fullscreen wrapper support via CustomPlayerWidgets.fullscreenWrapper.

    • Allows wrapping the entire fullscreen player with a custom widget or layout.

3.0.1 3.0.2 #

🛠 Fix

  • Dart formatter

3.0.0 #

💥 Breaking Changes

  • Removed global playback control system (GlobalPlaybackControlSettings and GlobalPlaybackController usage). App initialization is now simplified — no BlocProvider needed.

  • Removed parameters from PlayerUIVisibilityOptions: showRefreshButtonInErrorPlaceholder, showOpenExternallyInErrorPlaceholder.

  • VideoPlayerErrorPlaceholder simplified — now displays only the themed error icon and message. If you want to keep using the previous version, you can pass it through CustomPlayerWidgets.errorPlaceholder. The old implementation is available here: Old Video Player Error Placeholder.

  • synchronizeMuteAcrossPlayers moved to VideoSourceConfiguration.

➡️ For migration details, see MIGRATION_GUIDE.md

🧩 Package Simplification

  • Removed dependencies: flutter_bloc, android_intent_plus, url_launcher, built_collection.

2.3.22 #

✨ New Features

  • Device volume support via volume_controller.

    • GlobalPlaybackController now listens to hardware volume changes.
    • Automatically updates mute/unmute state based on system volume.
    • No separate listener widget needed — single BlocProvider<GlobalPlaybackController> is enough.

2.3.21 #

🛠 Fix

  • Update exports

2.3.20 #

🛠 Fix

  • Fix issue with error into initializer

2.3.19 #

✨ New Features

  • Add showOpenExternallyInErrorPlaceholder option to PlayerUIVisibilityOptions

    • When set to true, displays a “Open Externally” button inside the error placeholder if video playback fails.
    • Defaults to true.
    • Enables users to open the video in an external app or browser when the player encounters an error.

2.3.18 #

✨ New Features

  • Add onSeekRequest callback to VideoPlayerCallbacks

    • Invoked before a seek operation is performed.
    • Returns a bool indicating whether the seek should proceed (true) or be cancelled (false).
    • Useful for implementing custom seek restrictions or validations.
    • ⚠️ Available only for videos that are not rendered inside a WebView

2.3.17 #

🛠 Fix

  • Fix issue with swipe to exit from fullscreen

2.3.16 #

🛠 Fix

  • Fix issue with seeking when the video has ended
    • Previously, attempting to seek after the video finished could cause unexpected behavior.
    • Now, seeking works correctly even when the video is at its end.

2.3.14 #

✨ New Features

  • Add showBottomControlsBarOnEndedFullscreen option to PlayerUIVisibilityOptions
    • When set to true, the video bottom controls bar is displayed in fullscreen mode after the video ends.
    • Defaults to false.

2.3.13 #

🛠 Fix

  • showPlayPauseReplayButton option to PlayerUIVisibilityOptions
    • Applies only when not in full screen

2.3.12 #

✨ New Features

  • Add showPlayPauseReplayButton option to PlayerUIVisibilityOptions
    • Allows controlling the visibility of the main play / pause / replay overlay button (centered on the video)
    • Defaults to true

2.3.11 #

🛠 Fix

  • Fixed a bug with youtube_explode_dart by forcing the use of YoutubeApiClient.androidVr when retrieving the video manifest.

2.3.10 #

🛠 Fix

  • Fixed an issue where autoplay videos would start even when the player was no longer visible on screen.
    • See issue: #29

✨ New Features

  • Added timeoutDuration parameter to VideoSourceConfiguration
    • Maximum wait time before considering playback failed
    • Defaults to 6 seconds
    • In the case of YouTube, the player will proceed with the fallback if enabled (default)
    • See issue: #33

2.3.9 #

✨ New Features

  • Add support for dynamically changing the video source after player initialization.
    • Introduced loadVideoSource(VideoSourceConfiguration configuration) in OmniPlaybackController
    • Lets you seamlessly switch between YouTube, Vimeo, network, or asset sources without rebuilding the widget — or simply load a different video
    • See issue: #26

2.3.8 #

🛠 Fix

  • Fixed Youtube WebView Error

2.3.7 #

✨ New Features

  • Show YouTube video thumbnail while controller initializes.
    • Thumbnail is displayed immediately when available
    • See issue: #28

2.3.6 #

🛠 Fix

  • Fixed CHANGELOG

2.3.5 #

✨ New Features

  • Added video finish callback support.

    • Introduced onFinished in VideoPlayerCallbacks.
    • Triggered once when a video reaches the end of playback.
  • Added replay callback support.

    • Introduced onReplay in VideoPlayerCallbacks.
    • Triggered when the user presses the replay button after video completion.
  • See issue: #25

2.3.4 #

🛠 Fix

  • Fixed window.onMessage handling by checking if data is String before casting
    • See issue: #24

2.3.3 #

✨ New Features

  • Added keyboard arrow key support for web.
    • Users can now use the left (←) and right (→) arrow keys to skip backward and forward during playback.
    • Skip duration follows the same logic as double-tap gestures (5s, 10s, 30s depending on consecutive presses).
    • See issue: #23

2.3.2 #

✨ New Features

  • Added showSwitchWhenOnlyAuto flag to PlayerUIVisibilityOptions.
    • Controls whether the Switch Quality button is displayed when no qualities are available and only the "Auto" option would appear in the dialog.
    • Default: true (button is still shown with "Auto").
    • If set to false, the button will be hidden when only "Auto" is available.
    • See issue: #22

2.3.1 #

✨ New Features

  • On YouTube WebView, in addition to showing "auto", the player now also displays the current playback quality
    • See issue: #22

2.3.0 #

✨ New Features

  • Added support for playing videos from the device's local file system
    • New factory: VideoSourceConfiguration.file
    • See issue: #18

2.2.6 #

🛠 Fix

  • Fixed incorrect duration display for YouTube videos in the video player
    • See issue: #15

2.2.5 #

🛠 Fix

  • Fixed autoplay issue with Vimeo videos

2.2.4 #

🛠 Fix

  • Ensure quality menu is always visible, positioned above or below the video depending on available space.
    • See issue: #22

2.2.3 #

🛠 Clean code

2.2.2 #

🛠 Fix

  • Show HQ quality options for Live YouTube videos that not use webview.
    • See issue: #22

2.2.1 #

✨ New Features

  • Added custom aspect ratio support for both normal and fullscreen modes.

    • New properties in PlayerUIVisibilityOptions: customAspectRatioNormal and customAspectRatioFullScreen.
    • If not provided, the aspect ratio defaults to the one from the video controller.
  • Added fullscreen orientation support.

    • New property in PlayerUIVisibilityOptions: fullscreenOrientation.
    • If null, the orientation is inferred from the video size (portrait if height > width, otherwise landscape).

2.2.0 #

✨ New Features

  • Added playback speed support to VideoSourceConfiguration and the player UI.

    • New properties: initialPlaybackSpeed (default 1.0) and availablePlaybackSpeed (e.g., [0.5, 1, 1.5, 2]).
    • Added showPlaybackSpeedButton to PlayerUIVisibilityOptions to toggle visibility of the speed button.
    • Added playbackSpeedButton icon in VideoPlayerIconTheme for customization.
    • See issue: #16
  • YouTube videos are now playable on web platforms, in addition to mobile.

2.1.5 #

🛠 Fix

  • Fixed a bug where toggling back from fullscreen caused the status bar to turn black.
    • See issue: #20

2.1.4 #

🛠 Fix

  • Fixed some imports

2.1.3 #

🛠 Fix

  • Fixed an aspect ratio issue.
    • See issue: #17

2.1.2 #

🛠 Fix

  • Updated supported video codecs to prevent playback errors on Android devices.
    • See issue: #17

2.1.1 #

🛠 Fix

  • Fixed an issue on iOS where the Vimeo player failed to initialize.

2.1.0 #

✨ Improvements

  • Vimeo WebView Migration

    • Replaced flutter_inappwebview with webview_flutter for Vimeo playback.

2.0.11 #

🛠 Fix

  • Fixed a problem where some YouTube videos failed to play due to no compatible streams being found or WebView initialization timing out.
    • See issue: #13

2.0.10 #

🛠 Fix

  • Fixed an issue where the onControllerCreated callback was invoked before the video controller was fully constructed.

    • This caused incorrect initialization behavior for WebView videos.

2.0.9 #

✨ New Features

  • Added controlsPersistenceDuration to PlayerUIVisibilityOptions.

    • This property controls the duration the video player controls remain visible after user interaction while the video is playing.
    • After this duration without interaction, the controls are hidden automatically.
    • Default value is Duration(seconds: 3).

2.0.8 #

✨ New Features

  • Added support for disabling automatic orientation lock in fullscreen mode via PlayerUIVisibilityOptions.enableOrientationLock (default: true).

  • When set to false, the player will not change or lock the device orientation in fullscreen, allowing manual control over orientation changes (e.g., via your own fullscreen callbacks).

2.0.7 #

🛠 Fix

  • Fixed audio-video sync issue when seeking in YouTube and network videos.

2.0.6 #

✨ New Features

  • YouTube WebView Fallback & Forced Mode

    • Added two new parameters inside VideoSourceConfiguration.youtube to improve robustness of YouTube playback:

      • enableYoutubeWebViewFallback (default: true) — enables an automatic fallback to a WebView-based YouTube player (via webview_flutter) when native playback using youtube_explode_dart fails.
      • forceYoutubeWebViewOnly (default: false) — skips native extraction entirely and plays YouTube videos only through the WebView player.

💡 Why this change? The youtube_explode_dart library, used by default to extract YouTube stream URLs, can be temporarily blocked due to YouTube’s rate-limiting mechanism when too many requests are made. When this happens:

  • Extraction fails for all videos (even those not previously blocked).
  • The issue typically resolves after waiting several hours.
  • Using a VPN does not bypass the block.

With this update:

  • If fallback is enabled, the player transparently switches to the WebView-based implementation, ensuring playback continues without waiting for the rate-limit block to expire.

2.0.5 #

✨ New Features

  • HLS (network) video support:
    • The player now supports HLS streams (.m3u8 files).
    • Allows quality selection for network-based HLS videos, just like with YouTube.
    • Controlled via the same preferredQualities and availableQualities parameters in VideoSourceConfiguration.network.
    • Automatically selects the best matching stream based on preferences or falls back to the highest quality.

2.0.4 #

🛠 Fixes

  • Resolved an issue where Vimeo videos would not autoplay as expected.
  • Fixed a bug causing the video to pause unexpectedly Issue #8 on GitHub

2.0.3 #

⚠️ Breaking Change

The customOverlayLayer field in CustomPlayerWidgets has been replaced by customOverlayLayers, a list of CustomOverlayLayer objects.

This allows adding multiple overlays on top of the video content, with fine-grained control over their rendering order.

Overlays are inserted into the rendering stack based on their level and order into list.

2.0.2 #

  • Added ignoreOverlayControlsVisibility flag to CustomOverlayLayer, this allows custom overlays to remain visible even when player controls are hidden (e.g., during auto-hide).

2.0.1 #

✨ New Features

  • Custom Overlay Layering Support:
    • Introduced CustomOverlayLayer, allowing insertion of custom widgets into the video player's visual stack.
    • Each overlay can now specify a level, which determines its rendering order relative to built-in player elements.

2.0.0 #

⚠️ Breaking Change

  • preferredQualities has changed from List<int> to List<OmniVideoQuality> to improve clarity and flexibility when selecting video quality.
  • Introduced new model: OmniVideoQuality, replacing raw integer representations with a structured quality model.

✨ New Features

  • YouTube quality switching:
    • Added support for changing video quality in YouTube playback.
    • Controlled via the new flag: showSwitchVideoQuality.
    • New parameter: availableQualities: List<OmniVideoQuality>? added to VideoSourceConfiguration of YouTube videos.

🎨 Theming Enhancements

New theme properties added to OmniVideoPlayerTheme:

  • menuBackground — dropdown background color
  • menuText — color for unselected quality options
  • menuTextSelected — color for the selected quality
  • menuIconSelected — checkmark color for selected quality
  • qualityChangeButton — icon used to open the quality menu
  • qualitySelectedCheck — icon used to mark the selected option

1.0.6 #

  • Fixed a bug where seeking in long YouTube videos caused noticeable delays

1.0.5 #

  • Improvement: autoplay is now managed correctly for better user experience
  • No parameter changes needed—just update the package to fix the issue

1.0.4 #

  • Feature: Added gesture-based fast-forward (enableForwardGesture)
  • Feature: Added gesture-based rewind (enableBackwardGesture)
  • Feature: Added gesture to exit fullscreen on vertical swipe (enableExitFullscreenOnVerticalSwipe)
  • All new gesture flags are enabled by default

1.0.3 #

  • Fix: Fallback to null if GlobalPlaybackController is not found

1.0.2 #

  • Fix bug when useGlobalPlaybackController: false

1.0.1 #

  • Resolve pub.dev analysis issues

1.0.0 #

  • Initial development release
63
likes
150
points
7.01k
downloads
screenshot

Documentation

API reference

Publisher

verified publisherleonardmatasel.it

Weekly Downloads

A Flutter widget for playing videos from YouTube, Vimeo, assets, and network sources — fully customizable and easy to integrate.

Repository (GitHub)
View/report issues

Topics

#video #youtube #vimeo #player #video-player

Funding

Consider supporting this project:

github.com

License

BSD-3-Clause (license)

Dependencies

flutter, flutter_inappwebview, http, synchronized, video_player, video_player_android, visibility_detector, volume_controller, wakelock_plus, web, youtube_explode_dart

More

Packages that depend on omni_video_player