All-in-one Flutter video player โ stream from YouTube, Vimeo, network, assets files
Introduction
omni_video_player is a Flutter video player built on top of Flutterโs official video_player
plugin. It supports YouTube (via youtube_explode_dart
), Vimeo videos (using flutter_inappwebview
), as well as network and asset videos. A single unified controller is provided to manage playback across all supported video types seamlessly.
๐จ Highly customizable โ tweak UI, show/hide controls, and easily integrate your own widgets.
๐ฎ The controller gives full control over video state and callbacks for smooth video management on mobile and web.
๐ฏ Long-term goal: to create a universal, flexible, and feature-rich video player that works flawlessly across all platforms and video sources, empowering developers with maximum control and customization options.
Supported Platforms & Status
Video Source Type | Android | iOS | Web | Status |
---|---|---|---|---|
YouTube | โ | โ | โ | โ Supported |
Vimeo | โ | โ | โ | โ Supported |
Network | โ | โ | โ | โ Supported |
Asset | โ | โ | โ | โ Supported |
Twitch | - | - | - | ๐ Planned |
TikTok | - | - | - | ๐ Planned |
Dailymotion | - | - | - | ๐ Planned |
โจ Features
- โ
Play videos from:
- YouTube (support for live and regular videos)
- Vimeo (public)
- Network video URLs
- Flutter app assets
- ๐ Customizable player UI (controls, theme, overlays, labels)
- ๐ Autoplay, replay, mute/unmute, volume control
- โช Seek bar & scrubbing
- ๐ผ Thumbnail support (custom or auto-generated for YouTube and Vimeo)
- ๐ Global playback & mute sync across players
- โถ Fullscreen player
- โ๏ธ Custom error and loading widgets
๐งช Demo
๐ Getting Started
Installation
dependencies:
omni_video_player: <latest_version>
๐ ๏ธ Android Setup
In your Flutter project, open:
android/app/src/main/AndroidManifest.xml
<!-- Add inside <manifest> -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- Add inside <application> -->
<application
android:usesCleartextTraffic="true"
... >
</application>
โ
The INTERNET
permission is required for streaming videos.
โ ๏ธ The usesCleartextTraffic="true"
is only needed if you're using HTTP (not HTTPS) URLs.
๐ iOS Setup
To allow video streaming over HTTP (especially for development or non-HTTPS sources), add the following to your Info.plist
file:
<!-- ios/Runner/Info.plist -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
๐ฆ Usage Examples
Network
VideoSourceConfiguration.network(
videoUrl: Uri.parse('https://example.com/video.mp4'),
);
YouTube
VideoSourceConfiguration.youtube(
videoUrl: Uri.parse('https://youtu.be/xyz'),
preferredQualities: [720, 480],
);
Vimeo
VideoSourceConfiguration.vimeo(
videoId: '123456789',
preferredQualities: [1080],
);
Asset
VideoSourceConfiguration.asset(
videoDataSource: 'assets/video.mp4'),
);
๐ฑ Example App
Explore the example/
folder for working demos:
- Full demo using different video sources:
main.dart
- Minimal setup with controller and play/pause logic:
example.dart
๐ก Great starting points to understand how to integrate and customize the player.
๐ฏ Sync UI with AnimatedBuilder
When using OmniPlaybackController
, the controller itself is a Listenable
, meaning it notifies listeners when playback state changes (e.g. play, pause, fullscreen).
To build dynamic UI that reacts to those changes (like updating a play/pause button), wrap your widgets with AnimatedBuilder
:
OmniVideoPlayer(
options: VideoPlayerConfiguration.youtube(
videoUrl: Uri.parse('https://www.youtube.com/watch?v=cuqZPx0H7a0'),
),
callbacks: VideoPlayerCallbacks(
onControllerCreated: (controller) {
_controller = controller;
setState(() {}); // Enables the button below
},
),
),
AnimatedBuilder(
animation: Listenable.merge([controller]),
builder: (context, _) {
if (controller == null) return const CircularProgressIndicator();
final isPlaying = controller.isPlaying;
return ElevatedButton.icon(
onPressed: () =>
isPlaying ? controller.pause() : controller.play(),
icon: Icon(isPlaying ? Icons.pause : Icons.play_arrow),
label: Text(isPlaying ? 'Pause' : 'Play'),
);
},
);
โ Why it's needed
Flutter widgets donโt rebuild on Listenable
changes by default. AnimatedBuilder
lets your UI stay in sync without manually calling setState()
on every controller update โ making your code more efficient and reactive.
โน๏ธ Recommended for any UI that depends on the controller (playback state, fullscreen, etc.). It ensures consistent behavior and avoids state mismatch.
๐ฎ Future Developments
Feature | Description |
---|---|
๐ Playlist Support | YouTube playlist playback and custom video URL lists |
โฉ Double Tap Seek | Skip forward/backward by configurable duration |
๐ Side Command Bars | Left and right customizable sidebars for placing user-defined widgets or controls. |
๐งญ Header Bar | Custom header with title, channel info, and actions |
๐ผ Picture-in-Picture (PiP) | Play video in floating overlay while multitasking |
๐ถ Quality Selection | Switch between 360p, 720p, 1080p, etc. during playback |
โฑ Playback Speed Control | Adjust speed: 0.5x, 1.5x, 2x, etc. |
๐ Looping / Repeat | Loop a single video or an entire playlist |
โฟ Accessibility | Screen reader support, keyboard nav, captions, ARIA, high contrast, etc. |
โฌ๏ธ Download / Offline Mode | Save videos temporarily for offline playback |
๐บ Chromecast & AirPlay | Stream to external devices like TVs or smart displays |
๐ Parental Controls | Restrict age-inappropriate or sensitive content |
โ๏ธ Settings Button | Easily access and configure playback preferences |
๐ License
BSD 3-Clause License โ see LICENSE
Libraries
- omni_video_player
- omni_video_player/controllers/global_playback_controller
- omni_video_player/controllers/omni_playback_controller
- omni_video_player/models/custom_player_widgets
- omni_video_player/models/global_playback_control_settings
- omni_video_player/models/player_ui_visibility_options
- omni_video_player/models/video_player_callbacks
- omni_video_player/models/video_player_configuration
- omni_video_player/models/video_source_configuration
- omni_video_player/models/video_source_type
- omni_video_player/theme/omni_video_player_theme
- omni_video_player/widgets/omni_video_player