The Polyglot journal
Does an SRT file have a frame rate?
SRT subtitles use elapsed time. Learn when a frame-rate change leaves that timing intact, when it changes playback speed, and how to read frame-based review notes.

SRT uses elapsed time, not a frame-rate setting
An SRT file gives each subtitle a start and end time in hours, minutes, seconds and milliseconds. It does not contain a video frame-rate header. If someone asks you to change an SRT from 24 fps to 25 fps, first establish whether the video actually plays faster or merely contains a different number of frames per second. Those operations can require different subtitle decisions.
The Library of Congress describes the conventional SRT timestamp as hours:minutes:seconds,milliseconds. A cue beginning at 00:01:12,480 starts 72.480 seconds into the playback timeline. The final 480 means milliseconds, not frame 480. Use the following checks with media and subtitle files you own or have permission to edit, and keep the received versions untouched.
Identify which clock your reference uses
A video editor may show frame timecode instead. Apple’s Final Cut Pro guide describes hours, minutes, seconds and frames, and distinguishes source timecode from project timecode. A reviewer’s note copied from that display is not automatically an SRT timestamp.
For an integer-rate, non-drop-frame timeline beginning at zero, divide the frame field by the frame rate to obtain the fraction of a second. At 25 fps, the frame field 12 represents 12/25 of a second, or 480 milliseconds. At 24 fps, the same field represents half a second. These original examples describe timecode arithmetic, not measured footage.
Do not convert a frame field by replacing its colon with a comma or padding it with a zero. That would turn 12 frames into 120 milliseconds, which is wrong in both examples. Confirm the editor’s display mode and the exact rate before interpreting a review note.
Zero-based integer rates
25 fps: 00:01:12:12
12 / 25 = 0.480 seconds
SRT: 00:01:12,480
24 fps: 00:01:12:12
12 / 24 = 0.500 seconds
SRT: 00:01:12,500Account for the timeline origin
A project might begin at timecode 01:00:00:00 while the delivered movie begins at elapsed time zero. In that specific arrangement, a project note at 01:00:12:12 on a 25 fps timeline maps to 00:00:12,480 in the delivered SRT. The one-hour origin is an offset, not a playback-speed difference.
Confirm what was actually exported. A leader, trimmed introduction or selected range changes the mapping. A source clip’s camera timecode can also differ from the project position where that clip appears. Record the reference clock and export start explicitly; never subtract an hour simply because the first timecode looks large.
Ask whether the video duration changed
Changing the number of frames per second does not necessarily change the timing of speech. FFmpeg’s official documentation, for example, describes an fps filter that duplicates or drops frames to produce a constant rate. It separately documents changing presentation timestamps to speed up or slow down playback. These are different operations; this article does not prescribe an FFmpeg command or claim Polyglot performs either conversion.
If the same words occur at the same elapsed times in the new export, retain the SRT timing and check it against that export. Do not scale every timestamp merely because a media inspector reports a new frame rate. Equal total duration is useful evidence, but it is not sufficient: an editor could have rearranged scenes while keeping the running time.
If the same frames are deliberately played faster, the subtitles may need a proportional timing change. For a simple 24-to-25 fps speed-up with no added frames, cuts or start offset, the new elapsed times are the old times multiplied by 24/25. A cue from 100 to 104 seconds becomes 96 to 99.840 seconds. Both endpoints and the cue duration change. Verify that the actual export follows this relationship before applying it.
Only for a confirmed speed-up:
old rate / new rate = 24 / 25
scale = 0.96
Start: 100 x 0.96 = 96.000 s
End: 104 x 0.96 = 99.840 s
Not a universal fps conversion.Keep fractional rates and drop-frame timecode separate
The simple frame-field examples above are limited to exact integer rates and a known zero-based origin. A label such as 23.976 or 29.97 is not interchangeable with 24 or 30. Drop-frame and non-drop-frame timecode also use different numbering conventions. Do not extend the worked examples to those cases by guessing a decimal rate or dividing an entire timecode label as though it were elapsed seconds.
For fractional-rate or drop-frame references, obtain an elapsed-seconds readout or a timed subtitle export from software configured for that exact timeline. Ask the editor to confirm the rate, timecode convention and origin. For variable-frame-rate media, an average fps value alone cannot identify the timestamp of every frame. Use actual media timestamps and verify against the delivered file.
Record the mapping before changing the file
Keep a short external note linking the reviewed video, subtitle revision and reference clock. Record whether the new video preserved elapsed timing, introduced a fixed offset, deliberately changed speed or changed its edit. This note is a manual handoff aid, not a Polyglot feature.
In Polyglot, an imported SRT keeps its cue timing for local review and export. A constant timing offset and individual cue edits are supported; automatic frame-rate conforming is not a promised capability. Translating the words does not diagnose a different video clock. Use the linked synchronization guide if the observed problem is offset, drift or an edit mismatch.
Video revision: __________
SRT revision: ____________
Reference: source / project
Display: seconds / timecode
Rate and convention: _____
Export starts at: ________
Timing change: ___________Verify the exported result, not its filename
Check a clear phrase near the start, middle and end against the exact final video, with any player subtitle-delay setting reset. Check edited boundaries too. A growing discrepancy suggests a different problem from a constant offset; a sudden jump after a cut should not be treated as a global frame-rate conversion.
After any justified retiming, reopen the exported file. Compare every cue with the original: text, identifiers, order and the intended changes to both endpoints. Look for rounding collisions, non-positive durations and accidental negative timestamps. Preserve intentional overlaps and account for any deliberate deletions. Then review the whole track at normal speed in the intended destination. A filename ending in “25fps.srt” proves none of these checks.
Sources & further reading
Library of Congress: SubRip timestamp structure
Apple: navigate using timecode in Final Cut Pro
FFmpeg: frame-rate conversion with the fps filter
FFmpeg: changing presentation timestamps with setpts
Published by Polyglot using an AI-assisted editorial workflow. How we prepare and update our guides.
Keep exploring.
Try it on your Mac.
Find the right tools for your words and video, with processing on your Mac.
Download nowApple Silicon · macOS 14.4 or later