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
}
}