Cutting Room
Compose and render videos with compositions, backed by FFMPEG.

This project is a Flutter Bounty Hunters proof-of-concept. Want more composition types and video controls? Fund a milestone today!

In the wild

cutting_room is used to render all videos on the Flutter Bounty Hunters Channel as well as the SuperDeclarative! Channel.


In Cutting Room, what you're trying to do is compose a composition that will be rendered using FFMPEG. When everything is said and done, a massive FFMPEG command will run at the command line and produce your video.

Cutting Room gives you declarative compositions so that you can compose a video, kind of like how you compose a Flutter widget tree. In the following example, a video is composed from two other video clips, played back to back (in series).

// Compose the desired video and build an FFMPEG command
// to render it.
final cliCommand = await CompositionBuilder().build(
  // This is your declarative video composition, much like
  // a widget tree in Flutter.
    compositions: [
        videoPath: "assets/Butterfly-209.mp4",
        videoPath: "assets/bee.mp4",

// Run the FFMPEG command.
final process = await Ffmpeg().run(cliCommand);

// Pipe the process output to the Dart console.
process.stderr.transform(utf8.decoder).listen((data) {

// Allow the user to respond to FFMPEG queries, such as file overwrite
// confirmations.

await process.exitCode;

Types of Compositions

cutting_room ships with a number of compositions, including...

  • SeriesComposition
  • LayeredComposition
  • ImageOverlayComposition
  • and more.

If the Compositions that ship with cutting_room don't fit your needs, you can always define your own. To implement a custom Composition, you need to understand how FFMPEG commands are defined, and then assemble FFMPEG filters that accomplish your goal.

Cutting Room Assets

Internally, cutting_room includes and uses a few assets. For example, cutting_room uses a PNG image filled with black to render black compositions. There are various reasons why these assets are used. In the future, cutting_room might find a way to get rid of them.

The important part is that these assets are files. These files are included with cutting_room, and you shouldn't notice them when you're running your app with the dart tool. However, if you compile your Dart app to a binary executable, you lose access to dependency assets, including those in cutting_room. In this case, cutting_room will write these assets to new files on your local file system when you run your app. For this reason, you shouldn't be surprised if some generated image and video files appear wherever you run your video rendering.