Subtitle problems
Subtitles not showing: 5 causes and the fix for each
Short answer
Captions go missing for three different reasons: the destination has no documented subtitle track for that surface, so nothing was ever attached; the file was rejected, and YouTube's own rule is the strictest published one (.srt basic form only, no style markup, plain UTF-8); or the track exists but is still being processed, which YouTube says can happen because processing time depends on the complexity of the audio. Fix the file first, then the platform setting, and burn captions into the picture when the platform documents no upload path.
Key takeaways
- First ask whether the platform documents a subtitle upload for that surface at all.
- YouTube accepts .srt in its basic form only, with no style markup, in plain UTF-8.
- YouTube says automatic captions may not be ready at upload; processing time depends on the audio.
- Burned-in captions cannot be mistimed or hidden, but they cannot be translated either.
- Validate the file before you upload, not after the post looks bare.
Caption track or burned-in text: which one you have
A caption track is a separate data track: the platform can switch it off, translate it, restyle it or refuse to load it, and the text keeps its own timing. Burned-in text is pixels in the picture. It cannot be switched off, restyled or mistimed by the player, but it cannot be translated either and it becomes part of the image forever.
That difference decides the fix. If the destination documents a subtitle upload for your surface, fix the file. If it does not, the only route that survives is burned-in text.
| What the platform documents | Track | Burned in |
|---|---|---|
| YouTube (Studio) | Upload a file, auto-sync, type manually, auto-translate | Works, but you own the styling |
| Auto captions are generated, with review before publish | Works | |
| TikTok | In-app Text tool; no subtitle file upload documented | Works, and is the only file route |
| No caption track documented for Pins | Works |
Where a platform documents neither, the burned-in route is not a workaround: it is the documented behavior. The table above lists only what each help page states.
What a caption file has to look like
YouTube documents what it accepts: SubRip (.srt) is supported in its basic form only, with no style markup recognized, and the file must be plain UTF-8. SubViewer (.sbv or .sub) is also supported. WebVTT (.vtt) is accepted with positioning, but styling is limited to bold, italic and underline. Timestamps are the part every player depends on, so a cue with a broken time code is a cue that never appears.
| Format | Extension | What YouTube documents |
|---|---|---|
| SubRip | .srt | Basic versions only, no style markup, plain UTF-8 |
| SubViewer | .sbv, .sub | Basic versions only, no style markup, plain UTF-8 |
| WebVTT | .vtt | Positioning supported, styling limited to b, i, u |
| TTML, DFXP | .ttml | Partial implementation |
A SubRip cue is a number, a start and stop time, then the text: 1 then 00:00:00,599 --> 00:00:04,160 then the line. The comma before the milliseconds is what makes it SubRip; a dot makes it SubViewer.
Free tools:Check a subtitle fileConvert SRT to VTTConvert VTT to SRT
Find your case
| What you see | What it usually means | Do this |
|---|---|---|
| No caption track on the post at all | The surface has no documented subtitle upload, so nothing was attached | Burn the captions into the picture (step 6) |
| Track loads but words are wrong | Automatic captions are machine generated and can mis-transcribe | Review and edit the track (step 3) |
| Nothing right after posting, captions appear later | The track is still being generated | Wait, then re-check the post (step 4) |
| Your uploaded file was refused | Style markup, a non-UTF-8 encoding or a broken time code | Strip to plain text and re-check (steps 1 and 2) |
| Cues appear late or early by a fixed amount | Timestamps do not match the upload file | Shift the whole track (step 5) |
| Captions show for you but not for viewers | The track is not published, or the viewer has captions off | Publish the track and confirm it is on (step 3) |
Fix it step by step
Check the file before the platform
Open the .srt in a text editor. YouTube documents that SubRip files are supported in their basic form only, that no style markup is recognized, and that the file must be plain UTF-8. Strip HTML-like tags, save as UTF-8 without a byte order mark, and confirm each cue has a start time, a stop time and text.
Confirm the destination documents a subtitle track
YouTube Studio documents Upload file, auto-sync, type manually and auto-translate under Subtitles. LinkedIn documents auto captions with an Add auto captions toggle. TikTok's editing help documents an in-app Text tool and no subtitle file upload, so on TikTok a file has nowhere to attach: burn the text in instead.
Publish and check the track
In YouTube Studio: left menu, Subtitles, choose the video, ADD LANGUAGE, then ADD. Upload a file with timing, auto-sync a transcript, type manually, or let auto-translate fill it. YouTube says automatic captions are published on the video when they are available, in the video's default language only. Review them: YouTube warns they can misrepresent speech because of mispronunciations, accents, dialects or background noise.
Wait when the track is still processing
YouTube states that automatic captions may not be ready at the time you upload, and that processing time depends on the complexity of the audio. LinkedIn makes the same point for auto captions: they can take some time, and a banner appears below the post once they are generated. Check the post again rather than re-uploading.
Shift the cues when the timing is simply off
A constant offset is fixed by moving every cue by the same amount:
ffmpeg -i video.mp4 -itsoffset 1.20 -i subs.srt -map 0:v -map 0:a -map 1 -c copy -c:s mov_text fixed.mp4. FFmpeg documents -itsoffset as the offset added to the input timestamps, so a positive value delays the subtitle stream by that duration.Burn the captions in as the reliable fallback
ffmpeg -i video.mp4 -vf "subtitles=subs.srt" -c:a copy -c:v libx264 -crf 20 out.mp4. The subtitles filter needs an FFmpeg built with libass and converts the file to ASS internally, so the result needs no font styling from the platform. Move the text out of the areas the player covers before you render it.
A caption file that survives a platform check
| Format | .srt (SubRip) or .vtt (WebVTT) · YouTube supports both |
|---|---|
| Encoding | Plain UTF-8, no byte order mark · YouTube's documented requirement for .srt |
| Styling | None in the file · YouTube does not recognize style markup in .srt |
| Timing | Start and stop time per cue · 00:00:00,599 --> 00:00:04,160 |
| Language | Match the track the platform expects · YouTube auto-translates from the default language only |
Work out the drift before you change anything
Drift has two shapes. Constant offset: the captions are correct but late or early by the same amount from the first word to the last, so one shift fixes it. Growing drift: the error is small at the start and large at the end, which means the file changed under the captions (a different cut, a removed intro, a re-encode that dropped or held frames) and the cues have to be re-timed against the exact file you upload.
| Frame rate | One frame | 100 frames | 1000 frames |
|---|---|---|---|
| 24 fps | 0.042 s | 4.2 s | 41.7 s |
| 25 fps | 0.040 s | 4.0 s | 40.0 s |
| 30 fps | 0.033 s | 3.3 s | 33.3 s |
| 60 fps | 0.017 s | 1.7 s | 16.7 s |
Computed: one frame is 1 divided by the frame rate, so at 30 fps a frame is 0.033 s and a cue that is four frames late is 0.13 s late. Measure at the start, in the middle and at the end; if the three numbers are the same, shift; if they grow, re-time.
Frequently asked questions
Why do my subtitles not show on TikTok?
TikTok's help documents captions as in-app text, not an uploaded subtitle file, so a file you attach has nowhere to go. Add text in the app with the Text tool, or burn the captions into the picture before uploading.
Why did YouTube reject my .srt file?
YouTube supports SubRip files in their basic form only, ignores style markup, and requires plain UTF-8. Strip the tags, re-save as UTF-8 and try again.
My captions appeared late on the post, is that a bug?
Probably not. YouTube says automatic captions may not be ready at upload and that processing time depends on the complexity of the audio. LinkedIn documents the same delay and shows a banner when the captions are ready.
Should I upload a subtitle file or burn captions in?
Upload a file where the platform documents a track, because it can be corrected, translated and switched off. Burn captions in where it does not, or where the exact position and style matter.
How do I fix subtitles that are a second late?
Shift every cue by the same amount with a subtitle timing tool, or attach a shifted copy with ffmpeg -i in.mp4 -itsoffset 1.0 -i subs.srt -map 0 -map 1 -c copy -c:s mov_text out.mp4.
Sources
- YouTube Help: Supported subtitle and closed caption files (official, checked 2026-10-07)
- YouTube Help: Add subtitles & captions (official, checked 2026-10-07)
- YouTube Help: Use automatic captioning (official, checked 2026-10-07)
- LinkedIn Help: Auto captions for videos on LinkedIn (official, checked 2026-10-07)
- TikTok Help: Editing TikTok videos and photos (official, checked 2026-10-07)
- FFmpeg Documentation: Command line options (-map, -c copy, -itsoffset) (official, checked 2026-10-07)
- FFmpeg Documentation: Video filters (crop, pad, scale, setsar, subtitles) (official, checked 2026-10-07)
Reviewed 2026-10-07. Steps not attributed to a source are general video practice or computed above.