On-Screen Text in AI Ad Films: Why We Composite It
Generated text fails; every title, legal row, and disclaimer is composited in code using Remotion, precise typography metrics, and safe zone rules.

Key takeaways
- Any on-screen text or mandatory disclaimer requirement forces the production timeline into Remotion.
- ffmpeg drawtext fails on local Windows workstations due to unhandled Fontconfig runtime errors.
- The legal row lands at the bottom edge at 32 px with 13.5 px type and logo height 42 px without background bands.
- Instagram chrome on 1080x1916 frames requires corner logos below y=250 and bottom 400 px clear for captions.
- Image-to-video source clips require a 2% overscan (scale to 1102x1959, center-crop to 1080x1920) to remove white edges.
Remotion compositing mandates and the Fontconfig failure
Rule: any on-screen text, including the mandatory disclaimer, forces the reel into Remotion. ffmpeg drawtext is not a fallback on our machine; it fails with a Fontconfig error.
In commercial video advertising, typography conveys critical brand identity, campaign messaging, and mandatory regulatory compliance disclosures. Relying on generative video models to render on-screen text directly produces illegible, vibrating letterforms that violate brand standards. Furthermore, attempting to burn in text using automated shell utilities like ffmpeg drawtext fails on local Windows development environments due to missing Fontconfig library dependencies. Consequently, our studio enforces an absolute rule: any project requiring on-screen typography must be composited programmatically within Remotion.
Every source clip is upscaled before it enters the timeline. Our default is ArtPlayer Fast at 2x, about 2 minutes per clip. We use Fast, not Quality, for photoreal footage because Quality over-sharpened skin and fabric into plastic.
Source media must be pre-processed before timeline assembly. Raw generative video clips are upscaled 2x using ArtPlayer Fast, requiring approximately 2 minutes of compute per take. Our testing demonstrated that the Quality tier over-sharpens dermal textures and textile weaves into synthetic plastic, whereas Fast preserves authentic filmic softness.
Legal typography metrics and background band rejections
The legal line sits on the bottom edge at about 32 px with 13.5 px text and no background band. A 0.9-opacity black strip placed mid-frame over the product was rejected in review.
Integrating compliance disclosures into luxury commercial films requires delicate graphic calibration. During creative reviews, an initial proposal featuring a 0.9-opacity black banner running across the lower third was rejected for obscuring hero product geometry. In our refined layout, the legal disclaimer sits cleanly along the bottom margin at an offset of approximately 32 px, rendered in 13.5 px typography directly over video without an opaque container.
| Graphic Component | Frame Coordinates | Typography / Scale Specification | Studio Production Protocol |
|---|---|---|---|
| Legal Disclaimer Row | Bottom margin offset ~32 px | 13.5 px text, side margins 40 px | Logo height 42 px (30 illegible; 46 orphans words) |
| Instagram Safe Zones | 1080x1916 vertical canvas | Corner logo at top 268 (below y=250) | Keep bottom ~400 px clear for captions and UI |
| Timeline Normalization | Image-to-video source clips | Scale 1102x1959, center-crop 1080x1920 | 2% overscan eliminates white generative edge lines |
| Video Upscaling Pass | Prior to timeline assembly | ArtPlayer Fast at 2x (~2 min/clip) | Fast avoids plastic over-sharpening from Quality tier |
| Overlay Opacity Audit | Mid-composition default | Verify opacity equals 1.0 (not 0.44) | Frame 235 of 242-frame cut showed 0.44 fade opacity |
The landed legal row on a 1080-wide frame: logo height 42, text 13.5 px, side margins 40. At logo height 30 the wordmark was illegible; at 46 the text wrapped and orphaned a word.
Balancing wordmark scale against accompanying text requires sub-pixel precision. On a standard 1080-pixel wide vertical canvas, fixing logo height at 42 px paired with 13.5 px text and 40 px side margins creates a balanced row. Shrinking the logo to 30 px rendered the brand mark unreadable on mobile screens, while enlarging it to 46 px forced text to wrap onto a secondary line, creating an unsightly orphaned word.
Social platform chrome safe zones and opacity auditing
Instagram chrome on a 1080x1916 frame: keep the corner logo below y=250 (we landed it at top 268). The bottom ~400 px holds the caption and action rail.
Designing for mobile social distribution requires respecting platform interface overlays. When rendering vertical video for Instagram Reels at 1080x1916, top-level account headers and audio indicators obscure content above y=250. Our layout anchors corner brand marks at top 268 px to ensure visibility beneath platform navigation. Similarly, the lower 400 px of the screen must remain free of vital narrative action to prevent overlap with user comments, captions, and engagement icons.
A still taken at frame 235 of a 242-frame composition showed the disclaimer at 0.44 opacity. Before judging an overlay, compute its opacity at that frame and pick one where it is 1.0; mid-composition is the safe default.
Evaluating graphic legibility requires verifying timeline keyframe states. During QA review, a test still extracted at frame 235 of a 242-frame cut revealed the disclaimer rendered at only 0.44 opacity because a fade-out curve had already initiated. Quality control audits must inspect frames during peak hold states where opacity equals 1.0.
Remotion runtime traps: fonts, interpolation, and overscan
loadFont with no arguments pulled every weight and subset and timed the render out. We scope weights and subsets explicitly.
Unoptimized web font loading can stall headless rendering pipelines. In Remotion, calling loadFont without parameters causes the script to download every available font weight and regional language glyph set, causing render processes to exceed CI/CD timeout thresholds. Studio code must explicitly scope font requests to utilized weights and subsets.
Remotion interpolate needs a strictly increasing inputRange. A fade whose first keyframe is 0 crashes; we hand-roll piecewise opacity for simple fades.
Animation functions enforce strict mathematical constraints. Remotion's interpolate utility requires strictly increasing numeric values across input ranges; passing duplicate zero values causes runtime crashes. For simple linear fades, our engineers implement hand-rolled piecewise opacity calculations.
White edge lines on image-to-video clips are removed at normalize time with a roughly 2% overscan: scale to 1102x1959, center-crop to 1080x1920.
Generative video outputs frequently display white edge seam artifacts along canvas borders. During clip normalization, our pipeline applies a 2% overscan, scaling clips to 1102x1959 and center-cropping to 1080x1920 to eliminate border defects.
Audio rebuilding, timing verification, and glassmorphism
Remotion renders silent. The audio mix is rebuilt after every trim change, padded and trimmed to the composition's exact duration.
Remotion does not multiplex audio tracks automatically during video synthesis. Following any timeline revision, the master audio mix must be programmatically recompiled, padded with silence, and trimmed to match the exact composition length.
Clip re-timing uses setpts on a pre-speed master. Verify the frame count with ffprobe -count_frames: the duration metadata lies after PTS edits.
When altering playback velocity, container duration headers often report inaccurate timestamps following presentation timestamp (PTS) edits. Engineers must verify true frame counts using ffprobe -count_frames.
Clip-to-clip cuts use a 14-frame (0.47 s) cross-dissolve. Cards dip to black instead of overlapping, because an overlapping card puts its text over video.
Glassmorphism only reads over video, where the blur has pixels to frost. On a flat card background it looks fake.



