Skip to content

Guides

Convert subtitle framerate: 23.976 to 25 fps and back

If you know the two framerates, a subtitle framerate conversion is the cleanest repair there is: one click, no anchors, no measuring. The whole difficulty is in the sentence before that one — knowing the two framerates, when one of them is not written down anywhere.

Your subtitle file does not have a framerate

This is the thing that makes the whole topic confusing, so it is worth getting out of the way first. Open an SRT in a text editor and you will find timestamps like 00:01:23,400 --> 00:01:26,120. Those are wall-clock times. There is no frame number in there, and no header declaring a rate. The same is true of WebVTT and ASS.

So when a download is labelled “25 fps”, that is not a property of the file — it is a note about the video the file was timed against. The subtitles are not in 25 fps; they are in seconds, and those seconds happen to line up with a 25 fps copy. Which means there is nothing to look up, and two ways to find out: from where you got it, or from how fast it drifts.

One real exception: MicroDVD .sub files store literal frame numbers ({1560}{1632}) and are genuinely unplayable without knowing the rate. If that is what you have, convert it to SRT first — this tool reads SRT, VTT and ASS.

Find your video’s framerate

This half is written down, and takes about fifteen seconds:

  • VLC — Tools → Codec Information. The Frame rate field under the video stream. It often reads something like 23.976024; round it.
  • Windows — right-click the file, Properties, Details tab, “Frame rate”.
  • Command line ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of csv=p=0 video.mkv. It prints a fraction: 24000/1001 is 23.976.

In practice you will see one of three numbers. 23.976 (the film standard, and what almost every digital release uses), 25 (PAL — European broadcast and older DVDs), and 24 (true cinema, rarer in the wild than people expect).

If you don’t know the subtitle’s rate, read it off the drift

A framerate mismatch is a fixed percentage error, so it declares itself in the drift rate. Note how far off the subtitles are near the start and near the end, and work out roughly how much error accumulates per ten minutes of video:

  • ~25 seconds per 10 minutes — a 23.976 ↔ 25 mismatch (4.1% apart). By far the most common one, and the reason a two-hour film ends up about 2.5 minutes adrift.
  • ~24 seconds per 10 minutes — a 24 ↔ 25 mismatch (4.0%). Honest warning: this is within a hair of the case above and you will not tell them apart by eye. Use whichever pair matches the video framerate you just looked up.
  • ~0.6 seconds per 10 minutes — a 23.976 ↔ 24 mismatch (0.1%). Barely visible in the first half hour and obvious by the end; easy to mistake for “my copy is slightly different”.
  • A few seconds, and not growing — not a framerate problem at all. That is a constant offset, and a preset would wreck it. See subtitles out of sync by a constant delay.

The 4% family and the 0.1% family are two orders of magnitude apart, which is what makes this measurement worth thirty seconds: you are not distinguishing between adjacent numbers, you are deciding which of two very different errors you have.

Picking the pair, and which way round it goes

Presets are labelled “A to B”, meaning the subtitles are A, my video is B. Subtitles timed for a 23.976 fps release, played against a 25 fps copy, need 23.976 to 25. Every timestamp is multiplied by 23.976 ÷ 25, or 0.95904.

If you would rather not reason about it, use the physical check instead. The higher-framerate copy of a given film is the shorter one — a 23.976 fps film shown at 25 fps runs about 115 minutes instead of 120. So going to a higher framerate must pull every subtitle earlier, and the last cue in the corrected file should land before the last cue in the original. Glance at the final timestamp after converting: if it moved the wrong way, or now sits past the end of your video, you have the pair backwards. Flip it.

When the preset alone doesn’t finish the job

A framerate conversion is a pure rescale: it multiplies, it does not add. That is exactly right when the two copies differ only in speed, and incomplete the moment they also differ in where they start. Trim a studio logo off the front of one release and the whole timeline slides by a constant, on top of the growing error.

The symptom is unmistakable and is good news: after the preset, the subtitles are off by the same amount everywhere instead of a growing one. You have removed the drift and exposed the offset underneath. Apply a constant shift on top and you are done.

If you do not know either number, skip the preset and use two anchor points instead. Marking one early line and one late line solves the scale and the offset in a single pass, and it does not care what the framerates were — which is the better route whenever the file came from somewhere that told you nothing about it.

Either way, write the correction into the file rather than into your player. A framerate mismatch is a property of the file you were given, and it follows that file to every device you send it to; VLC’s playback controls do not.