pro_video_editor
is an upcoming Flutter package designed to provide advanced video editing capabilities. This package will serve as an extension for the pro_image_editor.
- ๐ท Preview
- โจ Features
- ๐ง Setup
- โ Usage
- ๐ Sponsors
- ๐ฆ Included Packages
- ๐ค Contributors
- ๐ License
- ๐ Notices
Basic-Editor | Grounded-Design | Paint-Editor |
---|---|---|
![]() |
![]() |
![]() |
Crop-Rotate-Editor | Tune-Editor | Filter-Editor |
---|---|---|
![]() |
![]() |
![]() |
Paint-Editor-Grounded | Emoji-Editor | |
---|---|---|
![]() |
![]() |
- ๐ Metadata: Extract detailed metadata from the video file.
- ๐ผ๏ธ Thumbnails: Generate one or multiple thumbnails from the video.
- ๐๏ธ Keyframes: Retrieve keyframe information from the video.
- โ๏ธ Trim: Cut the video to a specified start and end time.
- โฉ Playback Speed: Adjust the playback speed of the video.
- ๐ Mute Audio: Remove or mute the audio track from the video.
- โ๏ธ Crop by
x
,y
,width
, andheight
- ๐ Flip horizontally and/or vertically
- ๐ Rotate by 90deg turns
- ๐ Scale to a custom size
- ๐ผ๏ธ Layers: Overlay a image like a text or drawings on the video.
- ๐งฎ Color Matrix: Apply one or multiple 4x5 color matrices (e.g., for filters).
- ๐ง Blur: Add a blur effect to the video.
- ๐ก Bitrate: Set a custom video bitrate. If constant bitrate (CBR) isn't supported, it will gracefully fall back to the next available mode.
- ๐ Progress: Track the progress of one or multiple running tasks.
- ๐งต Multi-Tasking: Execute multiple video processing tasks concurrently.
Method | Android | iOS | macOS | Windows | Linux | Web |
---|---|---|---|---|---|---|
Metadata |
โ | โ | โ | โ | โ | |
Thumbnails |
โ | โ | โ | โ | โ | โ |
KeyFrames |
โ | โ | โ | โ | โ | โ |
Rotate |
โ | โ | โ | โ | โ | ๐ซ |
Flip |
โ | โ | โ | โ | โ | ๐ซ |
Crop |
โ | โ | โ | โ | โ | ๐ซ |
Scale |
โ | โ | โ | โ | โ | ๐ซ |
Trim |
โ | โ | โ | โ | โ | ๐ซ |
Playback-Speed |
โ | โ | โ | โ | โ | ๐ซ |
Remove-Audio |
โ | โ | โ | โ | โ | ๐ซ |
Overlay Layers |
โ | โ | โ | โ | โ | ๐ซ |
Multiple ColorMatrix 4x5 |
โ | โ | โ | โ | โ | ๐ซ |
Blur background |
๐งช | ๐งช | ๐งช | โ | โ | ๐ซ |
Custom Audio Tracks |
โ | โ | โ | โ | โ | ๐ซ |
Merge Videos |
โ | โ | โ | โ | โ | ๐ซ |
Censor-Layers "Pixelate" |
โ | โ | โ | โ | โ | ๐ซ |
- โ Supported with Native-Code
โ ๏ธ Supported with Native-Code but not tested- ๐งช Supported but visual output can differs from Flutter
- โ Not supported but planned
- ๐ซ Not supported and currently not planned
No additional setup required.
var data = RenderVideoModel(
video: EditorVideo.asset('assets/my-video.mp4'),
// video: EditorVideo.file(File('/path/to/video.mp4')),
// video: EditorVideo.network('https://example.com/video.mp4'),
// video: EditorVideo.memory(videoBytes),
enableAudio: false,
startTime: const Duration(seconds: 5),
endTime: const Duration(seconds: 20),
);
Uint8List result = await ProVideoEditor.instance.renderVideo(data);
/// Listen progress
StreamBuilder<ProgressModel>(
stream: ProVideoEditor.instance.progressStream,
builder: (context, snapshot) {
var progress = snapshot.data?.progress ?? 0;
return CircularProgressIndicator(value: animatedValue);
}
)
/// Every option except videoBytes is optional.
var task = RenderVideoModel(
id: 'my-special-task'
video: EditorVideo.asset('assets/my-video.mp4'),
imageBytes: imageBytes, /// A image "Layer" which will overlay the video.
outputFormat: VideoOutputFormat.mp4,
enableAudio: false,
playbackSpeed: 2,
startTime: const Duration(seconds: 5),
endTime: const Duration(seconds: 20),
blur: 10,
bitrate: 5000000,
transform: const ExportTransform(
flipX: true,
flipY: true,
x: 10,
y: 20,
width: 300,
height: 400,
rotateTurns: 3,
scaleX: .5,
scaleY: .5,
),
colorMatrixList: [
[ 1.0, 0.0, 0.0, 0.0, 50.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ],
[ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ],
],
);
Uint8List result = await ProVideoEditor.instance.renderVideo(task);
/// Listen progress
StreamBuilder<ProgressModel>(
stream: ProVideoEditor.instance.progressStreamById(task.id),
builder: (context, snapshot) {
var progress = snapshot.data?.progress ?? 0;
return TweenAnimationBuilder<double>(
tween: Tween<double>(begin: 0, end: progress),
duration: const Duration(milliseconds: 300),
builder: (context, animatedValue, _) {
return Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
spacing: 10,
children: [
CircularProgressIndicator(value: animatedValue),
Text(
'${(animatedValue * 100).toStringAsFixed(1)} / 100',
style: const TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
),
)
],
);
});
}
)
The video editor requires the use of the pro_image_editor. You can find the basic video editor example here and the "grounded" design example here.
You can also use other prebuilt designs from pro_image_editor, such as the WhatsApp or Frosted Glass design. Just check the examples in pro_image_editor to see how it's done.
VideoMetadata result = await ProVideoEditor.instance.getMetadata(
video: EditorVideo.asset('assets/my-video.mp4'),
);
List<Uint8List> result = await ProVideoEditor.instance.getThumbnails(
ThumbnailConfigs(
video: EditorVideo.asset('assets/my-video.mp4'),
outputFormat: ThumbnailFormat.jpeg,
timestamps: const [
Duration(seconds: 10),
Duration(seconds: 15),
Duration(seconds: 22),
],
outputSize: const Size(200, 200),
boxFit: ThumbnailBoxFit.cover,
),
);
List<Uint8List> result = await ProVideoEditor.instance.getKeyFrames(
KeyFramesConfigs(
video: EditorVideo.asset('assets/my-video.mp4'),
outputFormat: ThumbnailFormat.jpeg,
maxOutputFrames: 20,
outputSize: const Size(200, 200),
boxFit: ThumbnailBoxFit.cover,
),
);
A big thanks to the authors of these amazing packages.
- Packages created by the Dart team:
Made with contrib.rocks.