Sume Timeline output: H.264, AAC 192k and 1-second keyframes
What a Timeline 1.0 MP4 contains for a Reel, Short or TikTok upload: libx264 CRF 20, yuv420p, AAC 192k, faststart, 1-second keyframes, and what you cannot set.

A Timeline 1.0 render is an H.264 MP4 in yuv420p with AAC audio at 192k, written with the moov atom up front (+faststart) and a keyframe every second. The compiler encodes with libx264 at -preset veryfast -crf 20. You do not choose the codec, the CRF or the preset: those keys are refused with a 400. This is read from the compiler source in the Sume repository on 2026-10-06.
What is in the MP4?
The one-second GOP exists so later caption burns can seek cleanly. It is a consequence of the compiler, not a documented knob.
| Setting | Value | Why it matters for upload |
|---|---|---|
| Video codec | H.264 (libx264) | The codec Reels guides recommend, per Postfa |
| Pixel format | yuv420p | Plays everywhere, including phones |
| Rate control | CRF 20, preset veryfast | Quality-targeted, so the bitrate follows the content |
| Keyframes | Every 1 second (GOP equals fps) | Caption burn and seeking land on a keyframe |
| Audio | AAC 192k | Above typical short-form minimums |
| Container | MP4, +faststart | Starts playing before the full download |
| Length | Set by -t to the declared length | Matches audio.duration_seconds |
Can I change the codec or bitrate for TikTok or Reels?
No. Sending codec, crf, preset, video_codec, audio_codec, ffmpeg_args or similar returns a 400, because the server compiles ffmpeg and callers never send filtergraphs or codecs. What you can steer is size and rate: the length, the output.width and output.height (even integers from 256 to 2160) and output.fps of 24, 25, 30 or 60. Leaving output.fps out matches the sources.
How do I check the delivered file?
Fetch video_url from GET /v1/jobs/:id/result, then probe it with video inspect and frames: false. The probe tells you the width, height and duration so you can confirm 1080x1920 before you upload.
Sources
Related posts
More in Developers
- Timeline 400 on codec, crf or ffmpeg_args: what a Reel spec can send
Sume Timeline refuses codec, crf, preset, filter_complex and ffmpeg_args with a 400. Which output fields it does accept for a 9:16 Reel or Short and why.
- Timeline segment_source_short_looped vs padded: loop or freeze a clip
When a clip is shorter than its slot, Sume Timeline either loops it or holds its last frame. How render.pad_mode auto, loop and freeze decide, with thresholds.
- Timeline mode sync for a 30-second Short: handle both 200 and 202
Sume Timeline mode sync waits up to 30 seconds and returns 200 if the render finished, else 202. Why a Short client must handle both, with a Python poll loop.
- Timeline warning transition_downgraded_to_cut: why a fade became a cut
Sume Timeline turns a fade, wipe or slide into a hard cut when the transition does not fit the clip. Why it happens in short vertical edits and how to avoid it.
Written by Sume