To merge SRT files, first decide which merge you need, because there are two different jobs. Joining puts part 2 after part 1, as with a film split into CD1 and CD2 or a recording that stopped and restarted: every timestamp in part 2 must move later by the length of part 1, and the cue numbers must continue. Combining two languages lays one file over the other so each cue shows both languages, one above the other: no timings move, and lines that play at the same time are stacked.
Both jobs take a minute in the free SRT merger, which runs in your browser, or in Subtitle Edit on the desktop. People also search "merge SRT with MP4", which is a third job: putting the subtitles into the video file. That is covered at the end. Steps below were checked on 21 October 2026.
Which merge do you need?
| Your situation | What has to happen | Good tools |
|---|---|---|
| Movie in two parts, CD1 and CD2 | Shift part 2 by part 1's length, then renumber | SRT merger, Subtitle Edit Join |
| Recording split into two files | Same as above | SRT merger, Subtitle Edit Join |
| A forced track plus a full track for the same video | Keep all timings, sort by start time | Subtitle Edit Join with Keep time codes |
| English file plus a Spanish file for the same video | Pair overlapping lines, stack them in one cue | SRT merger, Subtitle Edit Merge two subtitles |
| SRT plus an MP4 | Not a text merge: add a track or burn it in | FFmpeg, HandBrake |
Joining part 1 and part 2
Each SRT counts time from the start of its own video. The first line of part 2 might say 00:00:04,200, but in the joined file it has to appear 4.2 seconds after part 1 ends. So the offset is the length of part 1's video, not the end time of part 1's last subtitle. A subtitle file doesn't record how long its video runs, and there is usually silence or credits after the last line.
Here is the arithmetic for a part 1 that runs 52 minutes 10.480 seconds and ends with cue 712:
| Cue in part 2 | Original timing | After a +52:10.480 shift | New number |
|---|---|---|---|
| 1 | 00:00:04,200 to 00:00:06,800 | 00:52:14,680 to 00:52:17,280 | 713 |
| 2 | 00:00:07,900 to 00:00:10,050 | 00:52:18,380 to 00:52:20,530 | 714 |
Read the length from the video file's properties or your player, to the millisecond if it shows them. If you round to the nearest second, every line in part 2 can be up to half a second early or late.
In the browser: the SRT merger
- Open the SRT merger and add part 1 and part 2 in that order.
- Enter part 1's video length as the offset for part 2.
- Download the joined file, open it and check that the first line of part 2 now starts just after part 1's length.
The files are read in your browser and are not uploaded, which matters if the subtitles belong to an unreleased project.
On the desktop: Subtitle Edit's Join tool
Subtitle Edit is a free, open-source subtitle editor for Windows, macOS and Linux; version 5.3.0, released 14 October 2026, is the latest stable build on its GitHub releases page. Its Join subtitles documentation describes the tool:
- Open Tools > Join subtitles...
- Click New to add each file, or drag them onto the list, and put them in order: part 1 first.
- Choose Append time codes. Subtitle Edit shifts each file so it starts after the previous one, and Add ms after each file adds extra time at each join.
- Click Join, then save the result as SubRip.
The docs don't say whether "after the previous one" is measured from the previous file's last line or from something else, so check the join point. Play the first few lines of part 2 against the video. If they are early by a fixed amount, select them and use Synchronization > Adjust all times..., which can shift selected lines only. Tools > Renumber... rewrites the numbers if they need to start somewhere else.
The other option, Keep time codes, leaves every timing alone and sorts all lines by start time. It is for files that already share one timeline, such as a forced-subtitle track and a full track that is missing those lines. Using it on part 1 and part 2 would interleave the two halves.
With FFmpeg's concat demuxer, and its catch
FFmpeg can join files with its concat demuxer. Its formats documentation says the timestamps are adjusted so each file starts where the previous one finishes, and that the duration of each file is used to place the next one. For a subtitle file, that duration comes from the subtitles, not from the video, so part 2 lands too early unless you set the duration yourself with the duration directive. A list file for the example above, saved as list.txt:
ffconcat version 1.0
file part1.srt
duration 3130.48
file part2.srt
Then run ffmpeg -f concat -i list.txt -c copy joined.srt and play the result across the join. Three caveats from the same documentation: all files must have the same streams, so join SRT with SRT only; by default the demuxer rejects unsafe file paths, so keep simple file names in the same folder; and the concat section never mentions subtitles, so treat this as a route for people who already use FFmpeg and check the output.
By hand, for short files
Open both files in a plain-text editor. Paste part 2 into the subtitle time shift tool, shift it by part 1's length in seconds (3130.48 in the example), copy the result and paste it under part 1 with one blank line between the last cue and the first. The shifted part restarts its numbering at 1, so renumber it by hand or in Subtitle Edit. This is fine for a 20-line file and painful for a 700-line one.
Combining two languages into one bilingual SRT
A bilingual file shows, for example, the English line on top and the Spanish line below it in one cue. The tool pairs each English cue with the Spanish cue that plays at the same time and writes both texts into one block:
| Time | English file | Spanish file | Bilingual cue |
|---|---|---|---|
| 00:01:02,100 to 00:01:04,000 | Where were you? | ¿Dónde estabas? | Where were you? / ¿Dónde estabas? on two lines |
| 00:01:04,300 to 00:01:06,900 | At the station. | En la estación. | At the station. / En la estación. on two lines |
The timings rarely match to the millisecond, because each file was timed separately. Subtitle Edit's Merge two subtitles documentation handles that by pairing lines by overlap, and its menu is Tools > Merge two subtitles... With SubRip output it stacks subtitle 1's text over subtitle 2's. With Advanced SubStation Alpha (.ass) output, each language keeps its own style, so you can put the original at the top of the frame and the translation at the bottom. The SRT merger also combines two languages into one SRT in the browser.
Two lines per language means four lines on screen, which covers a lot of picture. Where you can, keep each language to one short line. If you only want viewers to choose a language rather than see both at once, don't merge: keep two separate files, or two tracks in the video.
"Merge SRT with MP4": muxing or burning
When people say they want to merge an SRT with an MP4, they mean one of two things.
Add it as a track (soft subtitles). The text sits inside the video file as a track viewers switch on and off, and the picture isn't touched. In FFmpeg, an MKV takes the SRT as it is:
ffmpeg -i video.mp4 -i subs.srt -map 0 -map 1 -c copy video-with-subs.mkv
An MP4 needs the text converted to MP4's own timed-text format, mov_text, so add one option:
ffmpeg -i video.mp4 -i subs.srt -map 0 -map 1 -c copy -c:s mov_text video-with-subs.mp4
Adding -metadata:s:s:0 language=eng before the output name labels the track as English in players that show track languages. In HandBrake, import the SRT on the Subtitles tab and leave Burn In unticked; HandBrake's subtitle documentation says soft subtitles appear as separate selectable tracks, and that WebM files can't carry them.
Burn it in (hard subtitles). The text is drawn into every frame, so it shows on every player and app, including feeds that autoplay on mute. Exact HandBrake, VLC and FFmpeg steps are in burn subtitles with HandBrake, VLC or FFmpeg.
If you don't have an SRT and just want captions on a short video, CapsAI works differently: it cannot take an SRT as input. It transcribes the speech in your MP4 or MOV, up to 10 minutes per video, and burns its own styled captions into a new MP4, as described on burn subtitles into video. If you already have a subtitle file you trust, use the steps above instead.
Check the merged file before you use it
- Play the join point. Watch the last lines of part 1 and the first lines of part 2 in the joined file, then one line near the very end.
- Match the encodings. If part 1 is UTF-8 and part 2 was saved in an older Windows encoding, accented letters break in one half only. Check both files first with the subtitle encoding checker.
- Keep the originals. A merged file is hard to split cleanly by hand, so don't overwrite the source files.
What to do next
For a quick join or a two-language file, open the SRT merger, add both files and download the result. Use Subtitle Edit when you also want to fix timings or styles in the same session, and FFmpeg or HandBrake when the subtitles need to go inside the video file.
