 
The ProVideoEditor is a Flutter widget designed for video editing within your application. It provides a flexible and convenient way to integrate video editing capabilities into your Flutter project.
Table of contents
- ๐ท Preview
- โจ Features
- ๐ง Setup
- โ Usage
- ๐ Sponsors
- ๐ฆ Included Packages
- ๐ค Contributors
- ๐ License
- ๐ Notices
Preview
| Basic-Editor | Grounded-Design | Paint-Editor | 
|---|---|---|
|   |   |   | 
| Crop-Rotate-Editor | Tune-Editor | Filter-Editor | 
|---|---|---|
|   |   |   | 
| Paint-Editor-Grounded | Emoji-Editor | |
|---|---|---|
|   |   | 
Features
๐ฅ Video Editing Capabilities
- ๐ 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.
๐ง Transformations
- โ๏ธ Crop by x,y,width, andheight
- ๐ Flip horizontally and/or vertically
- ๐ Rotate by 90deg turns
- ๐ Scale to a custom size
๐จ Visual Effects
- ๐ผ๏ธ 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.
๐ฑ Runtime Features
- ๐ Progress: Track the progress of one or multiple running tasks.
- ๐งต Multi-Tasking: Execute multiple video processing tasks concurrently.
Platform Support
| 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" | โ | โ | โ | โ | โ | ๐ซ | 
Legend
- โ 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 not planned
Setup
Android, iOS, macOS, Linux, Windows, Web
No additional setup required.
Usage
Basic Example
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);
/// If you're rendering larger videos, it's better to write them directly to a file
/// instead of returning them as a Uint8List, as this can overload your RAM.
///
/// final directory = await getTemporaryDirectory();
/// String outputPath = '${directory.path}/my_video.mp4';
///
/// await ProVideoEditor.instance.renderVideoToFile('${directory.path}/my_video.mp4', data);
/// Listen progress
StreamBuilder<ProgressModel>(
    stream: ProVideoEditor.instance.progressStream,
    builder: (context, snapshot) {
      var progress = snapshot.data?.progress ?? 0;
      return CircularProgressIndicator(value: animatedValue);
    }
)
Quality Preset Example
/// Use quality presets for simplified video export configuration
/// Available presets: ultra4K, k4, p1080High, p1080, p720High, p720, p480, low, custom
var data = RenderVideoModel.withQualityPreset(
    video: EditorVideo.asset('assets/my-video.mp4'),
    qualityPreset: VideoQualityPreset.p1080,  // 1080p at 8 Mbps
    startTime: const Duration(seconds: 5),
    endTime: const Duration(seconds: 20),
);
Uint8List result = await ProVideoEditor.instance.renderVideo(data);
/// Override the preset's bitrate if needed
var customData = RenderVideoModel.withQualityPreset(
    video: EditorVideo.asset('assets/my-video.mp4'),
    qualityPreset: VideoQualityPreset.p720,
    bitrateOverride: 5000000,  // 5 Mbps instead of default 3 Mbps
);
Advanced Example
/// 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,
                ),
              )
            ],
          );
        });
    }
)
Editor Example
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.
Metadata Example
VideoMetadata result = await ProVideoEditor.instance.getMetadata(
    video: EditorVideo.asset('assets/my-video.mp4'),
);
Thumbnails Example
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,
    ),
);
Keyframes Example
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,
    ),
);
Sponsors
Included Packages
A big thanks to the authors of these amazing packages.
- Packages created by the Dart team:
Contributors
Made with contrib.rocks.
Libraries
- core/models/thumbnail/key_frames_configs.model
- core/models/thumbnail/thumbnail_base.abstract
- core/models/thumbnail/thumbnail_box_fit.model
- core/models/thumbnail/thumbnail_configs.model
- core/models/thumbnail/thumbnail_format.model
- core/models/video/editor_video_model
- core/models/video/export_transform_model
- core/models/video/progress_model
- core/models/video/render_video_model
- core/models/video/video_metadata_model
- core/models/video/video_quality_config
- core/models/video/video_quality_preset
- core/platform/io/io_helper
- core/platform/io/io_web
- core/services/web/web_manager
- core/services/web/web_meta_data_reader
- core/services/web/web_thumbnail_generator
- core/utils/web_blob_utils
- core/utils/web_canvas_utils
- pro_video_editor
- pro_video_editor_method_channel
- pro_video_editor_platform_interface
- pro_video_editor_web
- shared/utils/converters
- shared/utils/file_constructor_utils
- shared/utils/parser/double_parser
- shared/utils/parser/int_parser
- shared/utils/parser/size_parser