vido_ultra 1.0.0
vido_ultra: ^1.0.0 copied to clipboard
Professional universal video engine for Flutter. Supports VLC & Native backends with snapshots, custom tracks, and premium Glassmorphism UI.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:vido_ultra/vido_ultra.dart';
import 'dart:ui';
void main() {
runApp(const VidoUltraShowcase());
}
class VidoUltraShowcase extends StatelessWidget {
const VidoUltraShowcase({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData.dark().copyWith(
primaryColor: Colors.amber,
scaffoldBackgroundColor: const Color(0xFF0A0A0A),
cardTheme: CardThemeData(
color: const Color(0xFF161616),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
elevation: 0,
),
),
home: const AdvancedVideoDemo(),
);
}
}
class AdvancedVideoDemo extends StatefulWidget {
const AdvancedVideoDemo({super.key});
@override
State<AdvancedVideoDemo> createState() => _AdvancedVideoDemoState();
}
class _AdvancedVideoDemoState extends State<AdvancedVideoDemo> {
late UniversalVideoController _controller;
final List<String> _eventLogs = [];
bool _showAnalytics = true;
@override
void initState() {
super.initState();
_controller = UniversalVideoController(
config: VideoConfiguration(
overlaySlots: {
'badge': Positioned(
top: 12,
left: 12,
child: _buildBadge('ULTRA ENGINE', Colors.amber),
),
},
),
);
_controller.loadMedia(
'https://www.facebook.com/facebook/videos/paint-me-like-one-of-your-facebook-reels-video-by-sams-sketchbooksmusic-by-conni/9879297875528418/',
engineType: VideoEngineType.vlc,
);
_controller.eventStream.listen((event) {
if (mounted) {
if (event.type == VideoEventType.error &&
event.data.toString().contains('YouTube')) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
backgroundColor: Colors.redAccent,
content: Text('YouTube URL Detected: ${event.data}'),
duration: const Duration(seconds: 5),
action: SnackBarAction(
label: 'GUIDE',
textColor: Colors.white,
onPressed: () {
// Link to documentation or resolver guide
},
),
),
);
}
setState(() {
_eventLogs.insert(
0,
'[${event.timestamp.toString().split(' ').last.substring(0, 8)}] ${event.type.name.toUpperCase()}',
);
if (_eventLogs.length > 20) _eventLogs.removeLast();
});
}
});
}
static Widget _buildBadge(String text, Color color) {
return ClipRRect(
borderRadius: BorderRadius.circular(4),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
color: color.withValues(alpha: 0.2),
child: Text(
text,
style: TextStyle(
color: color,
fontSize: 9,
fontWeight: FontWeight.bold,
letterSpacing: 1,
),
),
),
),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: [
_buildSliverAppBar(),
SliverToBoxAdapter(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildSectionTitle('Active Playback'),
const SizedBox(height: 12),
Card(
clipBehavior: Clip.antiAlias,
child: UniversalVideoPlayer(controller: _controller),
),
const SizedBox(height: 24),
Row(
children: [
Expanded(child: _buildEngineControlCard()),
const SizedBox(width: 16),
Expanded(child: _buildQuickActionsCard()),
],
),
_buildSectionTitle('Pro-Tier Controls'),
const SizedBox(height: 12),
Row(
children: [
Expanded(
child: _buildActionButton(
Icons.auto_awesome,
'Enable ABR',
() {
// Adaptive Bitrate Toggle
},
),
),
const SizedBox(width: 12),
Expanded(
child: _buildActionButton(
Icons.filter_vintage,
'GPU Shader',
() {
_controller.applyShader('shaders/sepia.frag');
},
),
),
],
),
const SizedBox(height: 12),
Row(
children: [
Expanded(
child: _buildActionButton(
Icons.picture_in_picture,
'Enter PiP',
() {
// Enter PiP mode
},
),
),
const SizedBox(width: 12),
Expanded(
child: _buildActionButton(
Icons.security,
'Config DRM',
() {
_controller.setDRM(
DRMConfig(
licenseServerUrl: 'https://proxy.example.com',
),
);
},
),
),
],
),
const SizedBox(height: 24),
_buildSectionTitle('Enterprise Suite'),
const SizedBox(height: 12),
Row(
children: [
Expanded(
child: _buildActionButton(Icons.link, 'Deep Link', () {
_controller.handleDeepLink(
Uri.parse('vido://play?t=45s'),
);
}),
),
const SizedBox(width: 12),
Expanded(
child: _buildActionButton(
Icons.image,
'Auto Thumb',
() async {
final bytes = await _controller.generateThumbnail();
if (!context.mounted) return;
if (bytes != null) {
showDialog(
context: context,
builder: (_) => AlertDialog(
title: const Text('Generated Thumbnail'),
content: Image.memory(bytes),
),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'Thumbnail generation simulated (Architectural Hook)',
),
),
);
}
},
),
),
const SizedBox(width: 12),
Expanded(
child: _buildActionButton(
Icons.view_in_ar,
'VR Panorama',
() => _controller.enablePanorama(),
),
),
],
),
const SizedBox(height: 12),
_buildActionButton(Icons.cast, 'Cast Discovery', () {
_controller.startCastingDiscovery().listen((devices) {
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Found Devices: ${devices.join(", ")}'),
),
);
});
}),
const SizedBox(height: 24),
_buildSectionTitle('Track Management'),
const SizedBox(height: 12),
Row(
children: [
Expanded(
child: _buildActionButton(
Icons.audiotrack,
'Audio Tracks',
() async {
final tracks = await _controller.getAudioTracks();
debugPrint('Found ${tracks.length} audio tracks');
},
),
),
const SizedBox(width: 12),
Expanded(
child: _buildActionButton(
Icons.subtitles,
'Subtitles',
() async {
final tracks = await _controller
.getSubtitleTracks();
debugPrint(
'Found ${tracks.length} subtitle tracks',
);
},
),
),
],
),
const SizedBox(height: 24),
_buildAnalyticsHeader(),
if (_showAnalytics) _buildAnalyticsList(),
const SizedBox(height: 40),
],
),
),
),
],
),
);
}
Widget _buildSliverAppBar() {
return SliverAppBar(
expandedHeight: 120.0,
floating: false,
pinned: true,
backgroundColor: const Color(0xFF0A0A0A),
flexibleSpace: FlexibleSpaceBar(
title: const Text(
'VIDO ULTRA',
style: TextStyle(
fontWeight: FontWeight.w900,
letterSpacing: 4,
fontSize: 18,
color: Colors.amber,
),
),
centerTitle: true,
background: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Colors.amber.withValues(alpha: 0.1), Colors.transparent],
),
),
),
),
);
}
Widget _buildSectionTitle(String title) {
return Text(
title.toUpperCase(),
style: const TextStyle(
color: Colors.white38,
fontSize: 12,
fontWeight: FontWeight.bold,
letterSpacing: 2,
),
);
}
Widget _buildEngineControlCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Engine',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.amber,
),
),
const SizedBox(height: 12),
Container(
padding: const EdgeInsets.symmetric(horizontal: 12),
decoration: BoxDecoration(
color: Colors.black26,
borderRadius: BorderRadius.circular(8),
),
child: DropdownButtonHideUnderline(
child: DropdownButton<VideoEngineType>(
value: _controller.engineType,
isExpanded: true,
onChanged: (VideoEngineType? value) {
if (value != null) {
_controller.loadMedia(
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
engineType: value,
);
}
},
items: VideoEngineType.values.map((type) {
return DropdownMenuItem(
value: type,
child: Text(
type.name.toUpperCase(),
style: const TextStyle(fontSize: 12),
),
);
}).toList(),
),
),
),
],
),
),
);
}
Widget _buildQuickActionsCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Tools',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.amber,
),
),
const SizedBox(height: 12),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_buildActionButton(Icons.camera_alt, 'Snap', () async {
await _controller.captureFrame();
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Snapshot stored in memory'),
),
);
}
}),
_buildActionButton(Icons.speed, '2.0x', () {
_controller.setPlaybackSpeed(2.0);
}),
_buildActionButton(Icons.refresh, 'Reload', () {
_controller.loadMedia(
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
);
}),
],
),
],
),
),
);
}
Widget _buildActionButton(IconData icon, String label, VoidCallback onTap) {
return InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(8),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: BoxDecoration(
color: Colors.amber.withValues(alpha: 0.1),
borderRadius: BorderRadius.circular(8),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(icon, color: Colors.amber, size: 16),
const SizedBox(width: 8),
Text(
label,
style: const TextStyle(
color: Colors.amber,
fontSize: 10,
fontWeight: FontWeight.bold,
),
),
],
),
),
);
}
Widget _buildAnalyticsHeader() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_buildSectionTitle('Event Stream Analytics'),
IconButton(
onPressed: () => setState(() => _showAnalytics = !_showAnalytics),
icon: Icon(
_showAnalytics
? Icons.keyboard_arrow_up
: Icons.keyboard_arrow_down,
color: Colors.white24,
),
),
],
);
}
Widget _buildAnalyticsList() {
return Container(
height: 200,
decoration: BoxDecoration(
color: const Color(0xFF161616),
borderRadius: BorderRadius.circular(16),
),
child: _eventLogs.isEmpty
? const Center(
child: Text(
'Waiting for events...',
style: TextStyle(color: Colors.white12),
),
)
: ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 8),
itemCount: _eventLogs.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 4,
),
child: Row(
children: [
const Icon(Icons.bolt, color: Colors.amber, size: 12),
const SizedBox(width: 12),
Text(
_eventLogs[index],
style: const TextStyle(
color: Colors.white60,
fontSize: 11,
fontFamily: 'monospace',
),
),
],
),
);
},
),
);
}
}