brightcove_player_flutter
A Flutter plugin for integrating Brightcove video player into your Flutter applications. This plugin provides native Brightcove player support for both Android and iOS platforms.
Do check documentation.md for detailed installation
Features
- ✅ Cross-platform support: Android and iOS
- ✅ Native performance: Uses official Brightcove SDKs
- ✅ Easy integration: Simple widget-based API
- ✅ Video controls: Play, pause, seek functionality
- ✅ Event callbacks: Comprehensive video state callbacks
- ✅ Progress tracking: Real-time video progress updates
- ✅ Audio management: Proper audio focus handling
- ✅ Customizable: Support for custom account ID, policy key, and video ID
Installation Overview
Add this to your package's pubspec.yaml file:
dependencies:
brightcove_player_flutter: ^1.0.0
Then run:
flutter pub get
Platform Setup
⚠️ IMPORTANT SETUP REQUIREMENTS:
Before using this plugin, you must complete the platform-specific setup:
Android Setup:
- Add Brightcove repository to
android/build.gradle.kts- Add Brightcove dependencies to
android/app/build.gradle.kts- Minimum SDK version: 21
iOS Setup:
- Add Brightcove pods to
ios/Podfile- Run:
cd ios && pod install- Minimum iOS version: 13.0
Replace Credentials:
- Replace
'YOUR_ACCOUNT_ID'with your Brightcove account ID- Replace
'YOUR_POLICY_KEY'with your Brightcove policy key- Replace
'YOUR_VIDEO_ID'with your video IDSee detailed instructions below.
Android
1. Update android/app/build.gradle.kts
Add the Brightcove repository and dependencies:
repositories {
maven {
url = uri("https://repo.brightcove.com/releases")
}
google()
mavenCentral()
}
dependencies {
implementation("com.brightcove.player:exoplayer2:6.19.1")
implementation("com.brightcove.player:android-sdk:6.19.1")
}
2. Update android/build.gradle.kts
Ensure you have the Brightcove repository:
allprojects {
repositories {
maven {
url = uri("https://repo.brightcove.com/releases")
}
google()
mavenCentral()
}
}
3. Minimum SDK Version
Ensure your minSdkVersion is at least 21 in android/app/build.gradle.kts:
android {
defaultConfig {
minSdk = 21
}
}
iOS
1. Update ios/Podfile
Add Brightcove pods:
platform :ios, '13.0'
source 'https://github.com/brightcove/BrightcoveSpecs.git'
source 'https://cdn.cocoapods.org/'
target 'Runner' do
use_frameworks!
pod 'Brightcove-Player-Core'
pod 'Brightcove-Player-IMA'
pod 'GoogleAds-IMA-iOS-SDK'
end
2. Install Pods
cd ios
pod install
cd ..
3. Minimum iOS Version
Ensure your iOS deployment target is at least 13.0.
Usage
Note: Make sure to replace
'YOUR_ACCOUNT_ID','YOUR_POLICY_KEY', and'YOUR_VIDEO_ID'with your actual Brightcove credentials in all examples below.
Basic Example
import 'package:flutter/material.dart';
import 'package:brightcove_player_flutter/brightcove_player_flutter.dart';
// Or import directly:
// import 'package:brightcove_player_flutter/brightcove_player_widget.dart';
class VideoPlayerScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Brightcove Player')),
body: BrightcovePlayerWidget(
width: double.infinity,
height: 250,
accountId: 'YOUR_ACCOUNT_ID',
policyKey: 'YOUR_POLICY_KEY',
videoId: 'YOUR_VIDEO_ID',
onVideoStart: () {
print('Video started');
},
onVideoPlay: () {
print('Video playing');
},
onVideoPause: () {
print('Video paused');
},
onVideoEnd: () {
print('Video ended');
},
),
);
}
}
Advanced Example with Controls
import 'package:flutter/material.dart';
import 'package:brightcove_player_flutter/brightcove_player_flutter.dart';
// Or import directly:
// import 'package:brightcove_player_flutter/brightcove_player_widget.dart';
class AdvancedVideoPlayer extends StatefulWidget {
@override
_AdvancedVideoPlayerState createState() => _AdvancedVideoPlayerState();
}
class _AdvancedVideoPlayerState extends State<AdvancedVideoPlayer> {
final GlobalKey<BrightcovePlayerWidgetState> _playerKey = GlobalKey();
bool _isPlaying = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Brightcove Player')),
body: Column(
children: [
// Video Player
Container(
height: 250,
color: Colors.black,
child: BrightcovePlayerWidget(
key: _playerKey,
width: double.infinity,
height: 250,
accountId: 'YOUR_ACCOUNT_ID',
policyKey: 'YOUR_POLICY_KEY',
videoId: 'YOUR_VIDEO_ID',
onVideoStart: () {
setState(() => _isPlaying = true);
},
onVideoPlay: () {
setState(() => _isPlaying = true);
},
onVideoPause: () {
setState(() => _isPlaying = false);
},
onVideoEnd: () {
setState(() => _isPlaying = false);
},
),
),
// Controls
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconButton(
icon: Icon(_isPlaying ? Icons.pause : Icons.play_arrow),
onPressed: () {
if (_isPlaying) {
_playerKey.currentState?.pause();
} else {
_playerKey.currentState?.play();
}
},
),
IconButton(
icon: Icon(Icons.replay_10),
onPressed: () async {
final currentPos = _playerKey.currentState?.currentPosition ?? Duration.zero;
await _playerKey.currentState?.seekTo(
Duration(milliseconds: currentPos.inMilliseconds - 10000),
);
},
),
IconButton(
icon: Icon(Icons.forward_10),
onPressed: () async {
final currentPos = _playerKey.currentState?.currentPosition ?? Duration.zero;
await _playerKey.currentState?.seekTo(
Duration(milliseconds: currentPos.inMilliseconds + 10000),
);
},
),
],
),
// Progress Bar
StreamBuilder(
stream: Stream.periodic(Duration(milliseconds: 100)),
builder: (context, snapshot) {
final duration = _playerKey.currentState?.videoDuration ?? Duration.zero;
final position = _playerKey.currentState?.currentPosition ?? Duration.zero;
final progress = duration.inMilliseconds > 0
? position.inMilliseconds / duration.inMilliseconds
: 0.0;
return Slider(
value: progress,
onChanged: (value) async {
final seekPos = Duration(
milliseconds: (value * duration.inMilliseconds).toInt(),
);
await _playerKey.currentState?.seekTo(seekPos);
},
);
},
),
],
),
);
}
}
working example
https://github.com/user-attachments/assets/3118b93a-f38d-4985-881b-c743a4725485
API Reference
BrightcovePlayerWidget
A widget that displays a Brightcove video player.
Properties
| Property | Type | Description | Required |
|---|---|---|---|
accountId |
String? |
Your Brightcove account ID | Yes |
policyKey |
String? |
Your Brightcove policy key | Yes |
videoId |
String? |
The video ID to play | Yes |
width |
double? |
Width of the player | No |
height |
double? |
Height of the player | No |
onVideoStart |
VoidCallback? |
Called when video starts | No |
onVideoPlay |
VoidCallback? |
Called when video plays | No |
onVideoPause |
VoidCallback? |
Called when video pauses | No |
onVideoEnd |
VoidCallback? |
Called when video ends | No |
Methods (via GlobalKey)
Access methods through a GlobalKey<BrightcovePlayerWidgetState>:
final GlobalKey<BrightcovePlayerWidgetState> playerKey = GlobalKey();
// In your widget
BrightcovePlayerWidget(key: playerKey, ...)
// Later, control the player
playerKey.currentState?.play();
playerKey.currentState?.pause();
await playerKey.currentState?.seekTo(Duration(seconds: 30));
Available Methods
play()- Start video playbackpause()- Pause video playbackseekTo(Duration position)- Seek to a specific positiongetVideoDuration()- Get video duration (async)getCurrentPosition()- Get current playback position (async)isVideoReady()- Check if video is ready (async)
Getters
videoDuration- Current video durationcurrentPosition- Current playback positionisVideoReadyState- Whether video is ready
Event Callbacks
The widget provides several callbacks for video state changes:
- onVideoStart: Triggered when the video starts loading/playing
- onVideoPlay: Triggered when playback begins
- onVideoPause: Triggered when playback is paused
- onVideoEnd: Triggered when playback completes
Platform-Specific Notes
Android
- Requires minimum SDK version 21
- Audio focus is automatically managed
- Uses Brightcove ExoPlayer SDK
iOS
- Requires minimum iOS version 13.0
- Uses Brightcove Player SDK
- Requires CocoaPods installation
Troubleshooting
Android: Audio not working
- Ensure audio focus is granted (handled automatically)
- Check device volume settings
- Verify audio permissions in AndroidManifest.xml
iOS: Build errors
- Run
pod installin theiosdirectory - Ensure iOS deployment target is 13.0 or higher
- Clean build folder:
flutter clean
Video not loading
- Verify your account ID, policy key, and video ID are correct
- Check network connectivity
- Review native logs for error messages
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- Brightcove for providing the native SDKs
- Flutter team for the platform view support
Support
For issues, feature requests, or questions, please open an issue on the GitHub repository.
Changelog
See CHANGELOG.md for a list of changes and version history.
Libraries
- brightcove_player_flutter
- A Flutter plugin for integrating Brightcove video player.
- brightcove_player_widget
- main