VFX Compositing
Fabric provides three AI-powered compositing capabilities that collapse traditional multi-step VFX pipelines into single inference calls. All three use Seedance 2.0’s reference-to-video system under the hood, with automatic fallbacks when Seedance is unavailable.
These capabilities work as standalone SDK stages, as tasks within the long-form and ai-shorts pipelines, or as building blocks for custom workflows.
Pipeline Architecture
Section titled “Pipeline Architecture” ┌─────────────────────┐ │ Multi-View Character │ │ generate 4 angles │ └─────────┬─────────────┘ │ ┌─────────────────────┼─────────────────────┐ │ │ │ Green Screen Layer Editing B-Roll Generation footage + bg base video + elements (enhanced refs) → composite → sequential apply → ref2v with 4 views │ │ │ └─────────────────────┼─────────────────────┘ │ Final VideoMulti-View Character Consistency
Section titled “Multi-View Character Consistency”Traditional character consistency in AI video uses a single reference image. Multi-view generation produces 4 perspective views (front, 3/4, profile, back) from a single character photo, giving Seedance dramatically stronger consistency signals across different camera angles and shots.
How It Works
Section titled “How It Works”- A single character photo is passed to Seedance ref2v with angle-specific prompts
- The first frame of each generated video is extracted as a still image
- All 4 views are uploaded to fal CDN and stored as
_multiview_character_refs - Downstream b-roll and avatar calls pass all 4 views as
role: "subject"references - Seedance uses
@Image1-@Image4role assignments for each angle
Multi-view is automatic in the ai-shorts pipeline when using premium/ultra quality and an actor image is provided. No additional configuration needed.
# Automatic: premium/ultra with actor image triggers multi-viewfab ai-shorts "AI replacing developers" \ --quality ultra \ --actor-image ./my_actor.jpg
# Long-form also benefitsfab video/long-form "The Metaverse" \ --quality premium \ --presenter-look "young tech executive in a navy blazer"from fabric_platform import FabricClient
fabric = FabricClient()run = fabric.run_workflow("video/ai-shorts", input={ "topic": "AI replacing developers", "quality": "ultra", "actor_image_url": "https://example.com/actor.jpg", # multi-view character prep runs automatically})from fabric_workflow_sdk.stages.seedance import ( generate_multiview_character, build_multiview_reference_roles,)
# Generate 4 perspective viewsviews = await generate_multiview_character( "https://cdn.example.com/actor.jpg", num_views=4, view_angles=["front", "3/4 left", "profile right", "back"], resolution="720p",)# views = [{"url": "...", "angle": "front"}, ...]
# Build role assignments for downstream ref2v callsroles, refs = build_multiview_reference_roles( character_views=views, environment_urls=["https://cdn.example.com/bg1.jpg"],)# roles = {"@Image1": "character front view ...", "@Image2": "character 3/4 view ...", ...}# refs = [{"url": "...", "role": "subject"}, {"url": "...", "role": "subject"}, ...]Multi-View vs Single Reference
Section titled “Multi-View vs Single Reference”| Approach | References | Consistency | Cost |
|---|---|---|---|
| Single ref (default) | 1 character image | Good for front-facing shots | 1 image gen |
| Multi-view (premium/ultra) | 4 character images | Strong across all angles | ~$0.20 (4 x $0.05) |
Multi-view is most impactful for videos with diverse camera angles, multiple scenes, or character movement. For static talking-head videos, single reference is sufficient.
Green Screen Compositing
Section titled “Green Screen Compositing”Upload green screen footage and a background image — Seedance keys out the green screen, preserves the original camera motion, and composites the subject onto the new background in one step.
How It Works
Section titled “How It Works”- Foreground video is passed as a
motionreference (camera trajectory preservation) - Background image is passed as an
environmentreference - Seedance handles keying, edge preservation, and lighting integration
- If Seedance fails, falls back to ffmpeg
chromakeyfilter + overlay composite
# Long-form video with green screen footagefab video/long-form "The History of Visual Effects" \ --quality premium \ --greenscreen-footage-url "https://cdn.example.com/presenter_greenscreen.mp4"from fabric_platform import FabricClient
fabric = FabricClient()run = fabric.run_workflow("video/long-form", input={ "topic": "The History of Visual Effects", "quality": "premium", "greenscreen_footage_url": "https://cdn.example.com/presenter_greenscreen.mp4", # Pipeline auto-generates per-act backgrounds and composites})from fabric_workflow_sdk.stages.seedance import greenscreen_composite_seedance
# Composite green screen footage onto a backgroundresult_path = await greenscreen_composite_seedance( foreground_video_url="https://cdn.example.com/presenter_greenscreen.mp4", background_image_url="https://cdn.example.com/office_background.jpg", prompt="Professional office setting, warm lighting", preserve_camera_motion=True, duration=10, aspect_ratio="16:9",)Pipeline Integration
Section titled “Pipeline Integration”When greenscreen_footage_url is provided to the long-form pipeline:
generate_scene_backgrounds— generates one background image per act from the script’s visual cuesproduce_chapters— for each chapter, composites the green screen footage with the act’s background instead of generating b-roll- Falls back to standard b-roll generation for any chapter where compositing fails
Fallback Chain
Section titled “Fallback Chain”Seedance ref2v (motion + environment refs) → ffmpeg chromakey + overlay composite → Seedance i2v with background as start frameLayer-by-Layer Scene Editing
Section titled “Layer-by-Layer Scene Editing”Add visual elements (vehicles, weather effects, objects) from reference images into existing footage. Each element is placed at a specific spatial position while the original camera work is preserved.
How It Works
Section titled “How It Works”- Base video is passed as a
motionreference (camera anchoring) - Each element image is passed as a typed reference (
subject,weather,vehicle,environment) - Spatial placement directives tell Seedance where to integrate each element
- Layers are applied sequentially by default for highest quality — each layer builds on the previous result
# Long-form with scene layersfab video/long-form "Future of Transportation" \ --quality premium \ --scene-layers '[ {"url": "https://example.com/cybertruck.jpg", "role": "vehicle", "placement": "background right", "description": "silver cybertruck"}, {"url": "https://example.com/snow.jpg", "role": "weather", "placement": "atmospheric", "description": "light falling snow"} ]'from fabric_platform import FabricClient
fabric = FabricClient()run = fabric.run_workflow("video/long-form", input={ "topic": "Future of Transportation", "quality": "premium", "scene_layers": [ { "url": "https://example.com/cybertruck.jpg", "role": "vehicle", "placement": "background right", "description": "silver cybertruck driving on highway", }, { "url": "https://example.com/snow.jpg", "role": "weather", "placement": "atmospheric", "description": "light falling snow", }, ],})from fabric_workflow_sdk.stages.seedance import layer_edit_seedance
# Add a cybertruck and snow to existing footageresult_path = await layer_edit_seedance( base_video_url="https://cdn.example.com/highway_scene.mp4", layers=[ { "url": "https://cdn.example.com/cybertruck.jpg", "role": "vehicle", "placement": "background right", "description": "silver cybertruck", }, { "url": "https://cdn.example.com/snow.jpg", "role": "weather", "placement": "atmospheric", "description": "light falling snow", }, ], prompt="Highway scene at dusk with light snowfall", duration=10, aspect_ratio="16:9",)Layer Specification
Section titled “Layer Specification”Each layer is a dict with these fields:
| Field | Type | Required | Description |
|---|---|---|---|
url | string | yes | Image URL of the element to add |
role | string | yes | subject, vehicle, weather, or environment |
placement | string | no | Spatial directive: foreground left, background center, atmospheric, etc. |
description | string | yes | What the element is: red cybertruck, falling snow, neon sign |
Sequential vs Parallel Application
Section titled “Sequential vs Parallel Application”By default, layers are applied sequentially — each layer sees the result of all prior layers, producing the most coherent composite. For workflows with many layers, consider:
| Mode | Quality | Speed | When to use |
|---|---|---|---|
| Sequential (default) | Highest | Slower (N calls) | 1-3 layers, quality-critical |
| Parallel (planned) | Good | Faster (1 call + composite) | 4+ layers, speed-critical |
Parallel layer application will be available when sub-graph fan-out ships (Phase 33).
Cost Reference
Section titled “Cost Reference”| Operation | Model | Cost per call |
|---|---|---|
| Multi-view (per view) | bytedance/seedance-2.0/multiview | $0.05 |
| Multi-view (4x bundle) | seedance/multiview-4x | $0.20 |
| Green screen composite | bytedance/seedance-2.0/greenscreen-composite | $0.15 |
| Green screen (fast) | bytedance/seedance-2.0/fast/greenscreen-composite | $0.08 |
| Layer editing | bytedance/seedance-2.0/layer-edit | $0.15 |
| Layer editing (fast) | bytedance/seedance-2.0/fast/layer-edit | $0.08 |
| ffmpeg fallback | local | $0.00 |
Example Cost Breakdown
Section titled “Example Cost Breakdown”| Workflow | Multi-View | Green Screen | Layers | Total Added |
|---|---|---|---|---|
| ai-shorts (ultra) | $0.20 | — | — | +$0.20 |
| long-form 5ch (premium + greenscreen) | $0.20 | 5 x $0.15 | — | +$0.95 |
| long-form 5ch (premium + 2 layers) | $0.20 | — | 5 x 2 x $0.15 | +$1.70 |
Quality Presets
Section titled “Quality Presets”These features are available at the premium and ultra quality tiers:
| Tier | Multi-View | Green Screen | Layer Editing |
|---|---|---|---|
| free/budget/cheap | — | — | — |
| standard | — | — | — |
| premium | automatic | via input | via input |
| ultra | automatic | via input | via input |
Protobuf Contracts
Section titled “Protobuf Contracts”Typed stage I/O contracts are defined in proto/fabric/stages/v1/stages.proto:
MultiViewInput/MultiViewOutput/MultiViewImageGreenScreenInput/GreenScreenOutputLayerEditInput/LayerEditOutput/SceneLayer
These contracts are optional — the API always accepts arbitrary JSON — but provide autocompletion and type checking in SDKs.
Related
Section titled “Related”- Long-Form Video Pipeline — green screen and layer editing integrate here
- AI Shorts Pipeline — multi-view character prep integrates here
- Shot Design & Consistency — cinematography system used by all video generation
- Model Configuration — quality presets and provider selection