23.976 fps clip for a YouTube Short: omit output.fps in Sume

Sume's output.fps accepts 24, 25, 30 and 60. For a 23.976 fps source, omit it so the render matches the source, because YouTube keeps native frame rates.

5 min readSume
All posts

Short answer

Leave output.fps out. Timeline 1.0 then renders at the rate of your sources, which keeps a 23.976 fps clip at 23.976 instead of forcing it to 24. YouTube's help page on frame rate says it supports native frame rates without resampling (read 2026-10-05), so there is no reason to convert.

What the two sides document

YouTube's frame rate and aspect ratio page says it supports native frame rates without resampling, and it describes no letterbox or pillarbox for a video that matches the frame (read 2026-10-05). It does not give vertical specs, so it does not change the 9:16 advice for Shorts. The Shorts help page covers the other half: square or vertical, up to 3 minutes.

On the Sume side, output.fps accepts 24, 25, 30 or 60. If you send a value that differs from a source's rate, the job repeats or drops a frame at intervals, which shows up as judder on motion, and the result carries an output_fps_resamples_sources warning with the rate the sources wanted. That is the signal that you chose a rate the footage did not have.

Choosing the value

Frame-rate choices in Timeline 1.0, read 2026-10-05
Your sourcesoutput.fpsWhat happens
All 23.976 fpsOmitRenders at the source rate, no resample
All 23.976 fps24Resamples, warning output_fps_resamples_sources
Mixed 30 and 60 fpsOmitThe longest video sources decide the rate
All 60 fps60Matches, no resample
Stills onlyOmitStills have no rate, so 30 applies

Check the rate before the timeline

Run video inspect on each clip with frames set to false to get the probe only, and read the frame rate there. If a clip is the odd one out, either replace it or accept the resample warning for that render. Trim keeps the source frame rate unless you send an output block, and the output block is exact-precision only, so a keyframe trim never changes the rate.

A trim with output.fps set to 24 or 30 is a deliberate conform. Use it when you really want to normalize a mixed folder before assembly, and do it once, not in both trim and timeline.

import json

rates = {"a.mp4": 23.976, "b.mp4": 23.976, "c.mp4": 30.0}
if len(set(rates.values())) == 1:
    print("omit output.fps; sources agree at", set(rates.values()))
else:
    print("mixed rates:", json.dumps(rates), "- expect a resample warning")

After the render

Read warnings[] in the job result. An empty list means no resample happened. The render is $0.10 per ceil(output minute) either way, so a 60-second Short is $0.10.

If you need a deliberate conform, for example to join a 23.976 fps clip with a 30 fps clip into one evenly paced piece, do it once and name it. Either set output.fps on the timeline and accept the resample warning, or conform each odd clip with an exact video trim that has an output block. Doing it in both places stacks two resamples. Keep a note of the original rate beside the final file so a later re-render starts from the same assumptions.

For a one-off Short from a single camera, the simplest path needs no frame rate decision at all: trim the clip, put it in one slot, omit output.fps, and upload.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume