How to convert subtitles for JW Player
TL;DR — Convert subtitles to WebVTT for JW Player. Free browser tool handles SRT and ASS formats. No upload required — prepare captions for browser playback in seconds.
Related tool
JW Player Subtitle Converter
JW Player caption workflows usually work best when the final delivery file is WebVTT (VTT). JW Player is a browser-based video player, so it expects web-native subtitle formats. Converting SRT or ASS to VTT ensures captions work reliably across all browsers and JW Player configurations.
Quick answer
Use the JW Player Subtitle Converter to create VTT output from SRT, VTT, or ASS subtitle input before wiring captions into JW Player. The converter prepares the subtitle file, not the player configuration.
When to use this workflow
Use this workflow when:
- The source subtitle file is SRT from a collaborator: Transcription tools, translators, or clients often send SRT files
- The source file is ASS from an editing workflow: Aegisub or other subtitle editors export ASS with advanced styling
- Captions need to be hosted for a browser player: JW Player runs in the browser and expects VTT format
- JW Player captions fail because the file is not valid VTT: Wrong format, missing header, or malformed timestamps
If the file is already VTT, validate it first with the WebVTT Validator before debugging the player.
Why JW Player needs VTT
JW Player is built on HTML5 video technology, so it expects WebVTT format. For a format comparison, see best subtitle format for JW Player.
- Browser-native support: VTT is the W3C standard for HTML5 video captions
- Reliable parsing: JW Player’s caption engine is optimized for VTT
- Better debugging: If the VTT file is valid, caption issues are more likely to come from the player setup or server configuration, not the subtitle format
- Cross-browser compatibility: VTT works consistently across Chrome, Firefox, Safari, and Edge
Step-by-step workflow
1. Keep the original subtitle source file
Before converting, save a copy of the original file. You’ll need it if you want to make edits later or restore styling (for ASS files).
2. Convert to VTT
- Open the JW Player Subtitle Converter
- Upload or paste SRT, VTT, or ASS subtitle content
- Click Convert to VTT
- The tool automatically:
- Adds the
WEBVTTheader (if missing) - Converts timestamp format to VTT style (dots instead of commas)
- Removes SRT cue numbers (optional in VTT)
- Strips ASS styling and override tags
- Preserves subtitle text and timing
- Adds the
3. Review the VTT output
Check the converted VTT file:
- ✅ Header: First line is
WEBVTT(uppercase) - ✅ Timestamps: Use dots (
00:00:01.000), not commas (00:00:01,000) - ✅ Text: Subtitle text is intact and readable
- ✅ Encoding: Non-English characters display correctly
4. Download the VTT file
Click Download VTT to save the converted file. The file is ready to use in JW Player.
5. Host the file and attach it in JW Player
Upload the VTT file to your web server or CDN, then add it to the JW Player configuration:
jwplayer("myPlayer").setup({
file: "video.mp4",
tracks: [{
file: "captions.en.vtt",
label: "English",
kind: "captions",
default: true
}]
});
6. Test captions in the embedded player
Open the page in a browser and verify:
- Captions appear at the correct times
- Text is readable and properly formatted
- No timing drift or sync issues
- Captions work across different browsers (Chrome, Firefox, Safari, Edge)
What changes during conversion
From SRT to VTT:
- ✅ Header added:
WEBVTTline added at the top - ✅ Timestamps converted: Commas → dots (
00:00:01,000→00:00:01.000) - ✅ Cue numbers removed: Sequential numbers (
1,2,3) are optional in VTT - ✅ Text preserved: Subtitle text and timing stay the same
From ASS to VTT:
- ✅ Header added:
WEBVTTline added at the top - ✅ Timestamps converted: ASS format → VTT dot-based format
- ✅ Text preserved: Subtitle text stays the same
- ✅ Line breaks preserved: ASS
\N→ actual line breaks - ❌ Styling removed: Colors, fonts, borders, shadows are stripped
- ❌ Positioning lost: All subtitles appear in the default position
- ❌ Override tags removed:
{\an8},{\c&HFF0000&},{\pos(x,y)}, etc. are deleted
From VTT to VTT (cleanup):
- ✅ Validation: Checks for malformed timestamps, missing header, broken cue structure
- ✅ Normalization: Fixes common formatting issues
- ✅ Encoding: Ensures UTF-8 encoding
The output becomes easier to validate before player debugging.
Common mistakes
Using the right file at the wrong URL
Even a valid VTT file will not show if JW Player cannot fetch it. Test the caption URL directly after upload or deployment.
Fix: Open the VTT URL in a browser tab to verify it’s accessible. Check for 404 errors, CORS issues, or wrong MIME type.
Renaming instead of converting
Changing .srt to .vtt leaves SRT timing and missing WebVTT structure behind. Browsers reject renamed files.
Fix: Use the JW Player Subtitle Converter to properly convert the file.
Skipping validation
If captions do not show, validate the VTT file before changing the player code. Many caption issues come from malformed files, not player configuration.
Fix: Validate the VTT file with the WebVTT Validator first. See how to validate WebVTT files for a detailed walkthrough.
Using the wrong MIME type
If the server sends Content-Type: text/plain or application/octet-stream, the browser refuses to parse the file as WebVTT.
Fix: Configure the server to send Content-Type: text/vtt for .vtt files. See How to fix VTT MIME type for HTML5 video for server-specific instructions.
Forgetting CORS headers for cross-origin VTT files
If your video page is at example.com and the VTT file is at cdn.example.com, the browser blocks the request unless the server sends Access-Control-Allow-Origin headers.
Fix: Configure CORS on the CDN or origin server.
Not testing in multiple browsers
A VTT file that works in Chrome may fail in Firefox or Safari due to stricter parsing or CORS enforcement.
Fix: Test the VTT file in all target browsers (Chrome, Firefox, Safari, Edge) before deploying to production.
Troubleshooting scenarios
Scenario 1: Captions don’t appear in JW Player
Possible causes:
- VTT file is malformed (missing
WEBVTTheader, wrong timestamp format) - Server sends wrong MIME type (
text/plaininstead oftext/vtt) - CORS headers missing (cross-origin request blocked)
- Track configuration has wrong
fileURL (404 error) - JW Player version doesn’t support VTT (very old versions)
Fix:
- Validate the VTT file with the WebVTT Validator
- Check the browser console for errors (F12 → Console tab)
- Check the Network tab for the VTT request - verify it returns 200 OK and
Content-Type: text/vtt - If cross-origin, verify CORS headers
- Update JW Player to the latest version if using an old version
For MIME type issues, see how to fix VTT MIME type for HTML5 video. For a broader troubleshooting walkthrough, see Why JW Player captions are not showing.
Scenario 2: Captions appear but text is garbled
Cause: Wrong text encoding (e.g., Windows-1252 instead of UTF-8).
Fix: Re-save the source file as UTF-8 before converting, or use the Subtitle Encoding Fixer after conversion.
Scenario 3: Captions work in Chrome but not Firefox or Safari
Cause: Firefox and Safari are stricter about MIME types and CORS than Chrome.
Fix:
- Confirm
Content-Type: text/vtt(nottext/plain) - If cross-origin, ensure
Access-Control-Allow-Originis set - Check the browser console for specific error messages
Scenario 4: Timestamps are off by a few seconds
Cause: Rounding errors during conversion, or the original file had precision issues.
Fix: Use the Subtitle Time Shifter to adjust timing after conversion.
Scenario 5: Some cues are missing from the VTT output
Cause: The source file has malformed cues (missing timestamps, wrong format) that the converter skipped.
Fix: Validate the source file before converting. Fix any errors, then re-convert.
Frequently asked questions
Does JW Player support SRT natively?
JW Player can parse SRT in some cases, but VTT is the recommended format. SRT support is not guaranteed across all JW Player versions and configurations.
What’s the difference between SRT and VTT?
| Difference | SRT | VTT |
|---|---|---|
| Header | None | WEBVTT required |
| Timestamps | 00:00:01,000 (comma) | 00:00:01.000 (dot) |
| Browser support | ❌ Not native | ✅ Native |
| JW Player support | ⚠️ Partial | ✅ Native |
Can I style VTT captions in JW Player?
Yes. JW Player supports custom caption styling via CSS and configuration options. You can customize font, color, background, size, and position.
How do I add multiple subtitle languages?
Add multiple tracks to the JW Player configuration:
jwplayer("myPlayer").setup({
file: "video.mp4",
tracks: [
{
file: "captions.en.vtt",
label: "English",
kind: "captions",
default: true
},
{
file: "captions.es.vtt",
label: "Español",
kind: "captions"
},
{
file: "captions.fr.vtt",
label: "Français",
kind: "captions"
}
]
});
What if my VTT file has a BOM (Byte Order Mark)?
Some text editors (Notepad on Windows) save UTF-8 files with a BOM - 3 invisible bytes at the start. The WebVTT parser sees this as garbage before WEBVTT and rejects the file.
Fix: Re-save the file as “UTF-8 without BOM” in your editor.
Can I use VTT for live streaming with JW Player?
Yes. JW Player supports live VTT captions via HLS (HTTP Live Streaming) or DASH (Dynamic Adaptive Streaming over HTTP).
What’s the best way to serve VTT files?
- MIME type: Configure your server to send
Content-Type: text/vtt - CORS: If cross-origin, send
Access-Control-Allow-Originheaders - Encoding: Always use UTF-8 encoding
Related guides
- Best subtitle format for JW Player
- How to convert subtitle files for web players
- How to convert SRT to VTT for HTML5 video
- How to convert ASS to VTT for web players
- How to fix VTT MIME type for HTML5 video
- How to fix invalid WebVTT timestamps
- Why JW Player captions are not showing
Related tools
Use the JW Player Subtitle Converter
Convert SRT or ASS subtitles to WebVTT captions for JW Player and browser-based video delivery. No signup, no upload, and everything runs locally in the browser.
Open JW Player converter