Filtergraph Playground

Build a RenderSpec and inspect the exact FFmpeg -filter_complex the renderer composes — identical to the Python executor via @reelforge/render-core.

Aspect
FPS
Layers
video out: [comp]has audio outvalid
-filter_complex
[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,setsar=1[bg];[1:v]chromakey=0x00FF00:0.18:0.1,scale=480:480:force_original_aspect_ratio=increase,crop=480:480,format=rgba,geq=r='r(X,Y)':g='g(X,Y)':b='b(X,Y)':a='if(lte(hypot(X-240,Y-240),240),alpha(X,Y),0)'[av];[bg][av]overlay=x=552:y=1392:format=auto[comp];[2:a]asplit=2[vo][vo_key];[3:a][vo_key]sidechaincompress=threshold=0.03:ratio=8:attack=5:release=250[duck];[vo][duck]amix=inputs=2:duration=first:dropout_transition=0[premix];[premix]loudnorm=I=-5:TP=-1.5:LRA=11[aout]
RenderSpec
{
  "output": {
    "width": 1080,
    "height": 1920,
    "fps": 30
  },
  "layout": "pip",
  "avatar": {
    "input": 1,
    "diameter": 480,
    "margin": 48
  },
  "caption_ass": "/tmp/captions.ass",
  "audio": {
    "narration": 2,
    "bgm": 3
  }
}
Menivor: finished short videos from a link or a topic