Menu
Products
Products
Video Hosting
Upload and manage your videos in a centralized video library.
Image Hosting
Upload and manage all your images in a centralized library.
Galleries
Choose from 100+templates to showcase your media in style.
Video Messaging
Record, and send personalized video messages.
CincoTube
Create your own community video hub your team, students or fans.
Pages
Create dedicated webpages to share your videos and images.
Live
Create dedicated webpages to share your videos and images.
For Developers
Video API
Build a unique video experience.
DeepUploader
Collect and store user content from anywhere with our file uploader.
Solutions
Solutions
Enterprise
Supercharge your business with secure, internal communication.
Townhall
Webinars
Team Collaboration
Learning & Development
Creative Professionals
Get creative with a built in-suite of editing and marketing tools.
eCommerce
Boost sales with interactive video and easy-embedding.
Townhall
Webinars
Team Collaboration
Learning & Development
eLearning & Training
Host and share course materials in a centralized portal.
Sales & Marketing
Attract, engage and convert with interactive tools and analytics.
"Cincopa helped my Enterprise organization collaborate better through video."
Book a Demo
Resources
Resources
Blog
Learn about the latest industry trends, tips & tricks.
Help Centre
Get access to help articles FAQs, and all things Cincopa.
Partners
Check out our valued list of partners.
Product Updates
Stay up-to-date with our latest greatest features.
Ebooks, Guides & More
Customer Stories
Hear how we've helped businesses succeed.
Boost Campaign Performance Through Video
Discover how to boost your next campaign by using video.
Download Now
Pricing
Log in
Get a demo
Get Started
Streaming video inside a Flutter app becomes more challenging when the content needs protection, and the player must behave differently from default controls. Many apps deal with copyrighted or sensitive media, so relying on the stock video player often leaves gaps in security and user control. Secure streaming helps ensure that only the intended user can access the video and prevents unwanted downloads or manipulations. Custom controls give developers the freedom to limit actions, guide user behavior, and create safer playback experiences. Together, these choices let the app handle video with more care and clarity, keeping both the content and the viewing flow consistent. Prerequisites Before you start, make sure you have these ready: Flutter development environment with Flutter SDK and an IDE (Android Studio, VS Code). Basic knowledge of Dart and Flutter widgets. A secure video source supporting HTTPS, preferably HLS/DASH streaming with token authentication or DRM. video_player package version 2.6.1 or later has been added to your project. Set Up Your Flutter Project Add video_player to your pubspec.yaml dependencies: dependencies: video_player: ^2.6.1 Run flutter pub get to install. Next, think about where your videos come from. For streaming, use a URL that points to a video file. Make sure the URL starts with https for security. If your videos are on a server, ensure it's set up to handle requests properly. Build the Basic Secure Video Player Create a Dart file for the video screen. Import packages: import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; Use the recommended constructor that supports URI and headers for token access: class VideoScreen extends StatefulWidget { @override _VideoScreenState createState() => _VideoScreenState(); } class _VideoScreenState extends State
{ late VideoPlayerController _controller; @override void initState() { super.initState(); _controller = VideoPlayerController.network( 'https://example.com/your-video.mp4', )..initialize().then((_) { setState(() {}); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Video Player')), body: Center( child: _controller.value.isInitialized ? AspectRatio( aspectRatio: _controller.value.aspectRatio, child: VideoPlayer(_controller), ) : CircularProgressIndicator(), ), ); } @override void dispose() { _controller.dispose(); super.dispose(); } } Key Improvements : Uses VideoPlayerController.networkUrl with HTTP headers to support token-based authentication. Supports HLS (m3u8) streaming for segmented streaming and is compatible with DRM. Handles video load errors gracefully by showing a message. Custom controls include play/pause and 10-second rewind/forward with position bounds checking. Add Custom Controls The default player doesn't have buttons, so let's add our own. We'll make a simple row of controls below the video. Add this to your build method, right after the AspectRatio: Column( children: [ AspectRatio( aspectRatio: _controller.value.aspectRatio, child: VideoPlayer(_controller), ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ IconButton( icon: Icon(_controller.value.isPlaying ? Icons.pause : Icons.play_arrow), onPressed: () { setState(() { _controller.value.isPlaying ? _controller.pause() : _controller.play(); }); }, ), IconButton( icon: Icon(Icons.replay_10), onPressed: () { _controller.seekTo(_controller.value.position - Duration(seconds: 10)); }, ), IconButton( icon: Icon(Icons.forward_10), onPressed: () { _controller.seekTo(_controller.value.position + Duration(seconds: 10)); }, ), ], ), ], ) Now you have play/pause, rewind 10 seconds, and fast-forward 10 seconds buttons. They update based on the video's state. You can tap them to control playback. This keeps the interface clean and lets users interact directly. Secure Your Video Streams To keep videos safe, use secure connections. Always load videos over HTTPS. If your server requires a login, add authentication. For instance, if you need a token, modify the controller like this: _controller = VideoPlayerController.network( 'https://example.com/your-video.mp4?token=your_secure_token', ); Get the token from your app's login system. This ensures only logged-in users can access the video. Also, consider encrypting videos on your server if they're sensitive. Flutter handles the playback, but security starts at the source. If you want to prevent downloading, stream the video in segments. Tools like HLS (HTTP Live Streaming) break videos into small parts, making it harder to save the whole thing. Set up your server to support HLS, and point the controller to the playlist URL. Handle Errors for Better Playback Videos don't always load perfectly. Add error handling to your controller: _controller = VideoPlayerController.network( 'https://example.com/your-video.mp4', )..initialize().then((_) { setState(() {}); }).catchError((error) { // Show an error message print('Video failed to load: $error'); }); In the build method, check for errors and show a message if needed. For better quality, let users choose resolutions if your video has multiple. You can add a dropdown to switch sources. Finally, test on real devices. Videos behave differently on phones versus emulators. Run your app, play the video, and tweak the controls until they feel right. This setup gives you a solid, secure way to stream videos with full control in Flutter.