---
title: "Captions for Streaming Video: WebVTT, SRT and CEA-608"
description: Learn streaming captions with WebVTT, SRT, and CEA-608, including SRT to VTT conversion and SRT vs VTT differences.
image: https://blog.blazingcdn.com/hubfs/Gemini-Blog/image-Oct-31-2026-08-30-37-0229-PM.jpeg
---

[![BlazingCDN](https://blog.blazingcdn.com/hubfs/Logo/blog-logo-w.png)](https://blog.blazingcdn.com?hsLang=en-us)

[📘Learn ▾](https://blog.blazingcdn.com/cdn-learn?hsLang=en-us)

[CDN Fundamentals](https://blog.blazingcdn.com/cdn-fundamentals?hsLang=en-us) [By Content Type](https://blog.blazingcdn.com/by-content-type?hsLang=en-us) [Advanced Concepts](https://blog.blazingcdn.com/advanced-concepts?hsLang=en-us) [Glossary](https://blog.blazingcdn.com/glossary?hsLang=en-us)

[⚡ Web Performance](https://blog.blazingcdn.com/web-performance?hsLang=en-us)

[🎬Video & Streaming ▾](https://blog.blazingcdn.com/video-streaming-cdn?hsLang=en-us)

[🔴 Live Streaming](https://blog.blazingcdn.com/live-streaming?hsLang=en-us) [📺 VOD & OTT](https://blog.blazingcdn.com/vod-ott?hsLang=en-us) [💰 Bandwidth & Costs](https://blog.blazingcdn.com/bandwidth-costs?hsLang=en-us)

[🏭 Other Industries ▾](https://blog.blazingcdn.com/cdn-industry-insights?hsLang=en-us)

[📺 Media & Broadcasting](https://blog.blazingcdn.com/media-broadcasting?hsLang=en-us) [💾 Software & SaaS](https://blog.blazingcdn.com/software-saas?hsLang=en-us) [🏗️ DevOps & Cloud Infra](https://blog.blazingcdn.com/devops-cloud-infra?hsLang=en-us) [📚 AdTech & Advertising](https://blog.blazingcdn.com/adtech-advertising?hsLang=en-us) [🎮 Gaming & Esports](https://blog.blazingcdn.com/gaming-esports?hsLang=en-us) [📱 Mobile Apps & Developers](https://blog.blazingcdn.com/mobile-apps-developers?hsLang=en-us) [🤖 AI & Machine Learning](https://blog.blazingcdn.com/ai-machine-learning?hsLang=en-us) [🏛️ Enterprise & Corporate](https://blog.blazingcdn.com/enterprise-corporate?hsLang=en-us) [📚 E-Learning & EdTech](https://blog.blazingcdn.com/e-learning-edtech?hsLang=en-us) [🏟️ Sports & Live Events](https://blog.blazingcdn.com/sports-live-events?hsLang=en-us)

[💰 Pricing & Costs ▾](https://blog.blazingcdn.com/cdn-pricing-and-cdn-costs?hsLang=en-us)

[Provider Pricing](https://blog.blazingcdn.com/provider-pricing?hsLang=en-us) [Cost Optimization](https://blog.blazingcdn.com/cost-optimization?hsLang=en-us) [Decision Support](https://blog.blazingcdn.com/decision-support?hsLang=en-us)

[⚡Compare ▾](https://blog.blazingcdn.com/cdn-comparison?hsLang=en-us)

[Provider Comparisons](https://blog.blazingcdn.com/provider-comparisons?hsLang=en-us) [Strategy Comparisons](https://blog.blazingcdn.com/strategy-comparisons?hsLang=en-us) [Ratings & Benchmarks](https://blog.blazingcdn.com/cdn-ratings-and-benchmarks?hsLang=en-us)

[📊 Benchmarks](https://blog.blazingcdn.com/cdn-ratings-and-benchmarks?hsLang=en-us)

[🔒 Security ▾](https://blog.blazingcdn.com/cdn-security?hsLang=en-us)

[Attack Protection](https://blog.blazingcdn.com/attack-protection?hsLang=en-us) [Encryption & Access](https://blog.blazingcdn.com/encryption-access?hsLang=en-us) [Video & DRM Security](https://blog.blazingcdn.com/video-drm-security?hsLang=en-us)

[📁 Case Studies](https://blog.blazingcdn.com/case-studies?hsLang=en-us) [🔌 Integrations](https://blog.blazingcdn.com/integrations?hsLang=en-us) [🛠️ Tools](https://blog.blazingcdn.com/cdn-tools?hsLang=en-us)

[Get Started](https://blazingcdn.com/sign-up-contact-form/)

[Learn](https://blog.blazingcdn.com/en-us/tag/learn) [Video - Video & Streaming](https://blog.blazingcdn.com/en-us/tag/video-video-streaming)

# Captions for Streaming Video: WebVTT, SRT and CEA-608

 Vadym Borovskyi  Oct 31, 2026, 9:33:28 PM

![](https://blog.blazingcdn.com/hubfs/Gemini-Blog/image-Oct-31-2026-08-30-37-0229-PM.jpeg)

Evaluated October 2026: for streaming captions, ship WebVTT to every web, mobile and HLS player, keep CEA-608 and CEA-708 in-band for live channels that also reach broadcast or set-top boxes, and treat SRT as an interchange file you convert at ingest. Most production OTT stacks run two of these three formats at once, and the packaging step is where they break.

As of 2026, WebVTT is the text subtitle format that HLS (RFC 8216) and the HTML5 text track were designed around, while SRT is accepted by neither without conversion. CEA-608 captions ride inside the video stream at two bytes per field per frame, roughly 60 characters per second, so they add zero extra HTTP requests to a stream.

## **WebVTT vs SRT vs CEA-608: what each caption format actually is**

The three formats sit at different layers. WebVTT and SRT are sidecar text files with cue timing. CEA-608 and CEA-708 are bitstreams carried inside the video elementary stream. That difference decides how they are packaged, how they are cached and how they fail.

### WebVTT

WebVTT (Web Video Text Tracks) is a W3C format served as text/vtt. A file opens with the WEBVTT header, and each cue has a timing line using a period before milliseconds, with the hour field optional. Cue settings control line, position, size, alignment and vertical text. Voice spans, classes and the ::cue pseudo-element give it real presentation control in browsers.

### SRT

SRT (SubRip Text) is a numbered list of cues with timestamps that use a comma before milliseconds and require the hour field. There is no formal specification and no positioning model. Players tolerate a handful of bold, italic and font tags, but nothing guarantees how they render. Its strength is universality: every captioning tool and vendor exports it.

### CEA-608 and CEA-708

CEA-608 is the line 21 analog caption standard carried forward into digital video. It offers four caption channels (CC1 to CC4), a 32-column by 15-row grid, a Western European character set, and pop-on, roll-up and paint-on modes. CEA-708 is its digital successor, at about 9,600 bit/s, with up to 63 caption services, windows, colors and font choices, and it carries 608 compatibility bytes alongside. Both travel in H.264 or HEVC SEI messages using the ATSC A/53 user data structure.

| Format | Carriage | Positioning and styling | Characters | HLS | DASH | Extra requests |
| --- | --- | --- | --- | --- | --- | --- |
| WebVTT | Sidecar text, segmented for live | Cue settings plus CSS in browsers | Full UTF-8 | Native SUBTITLES rendition | Sidecar text/vtt or wvtt in fMP4 | Segment plus playlist per interval |
| SRT | Single sidecar file | None standardized | Whatever the file encoding is | Not accepted | Not in DASH-IF guidance | Not deliverable as is |
| CEA-608 | In-band, video SEI | Fixed 32 by 15 grid | Western European subset | CLOSED-CAPTIONS, CC1 to CC4 | Accessibility descriptor | Zero |
| CEA-708 | In-band, video SEI | Windows, colors, fonts | Broader sets than 608 | CLOSED-CAPTIONS, SERVICE1 to SERVICE63 | Accessibility descriptor | Zero |

SRT is the only format in the table that no streaming manifest can reference directly, so every SRT pipeline ends in a conversion step.

## **SRT vs VTT: which subtitle file should you ship?**

Ship WebVTT to players and keep SRT only as a source format. WebVTT is accepted natively by HLS, Safari, AVPlayer, hls.js, Shaka Player and the browser text track API, and it supports positioning and UTF-8 without ambiguity. SRT is fine for exchanging captions with captioning vendors and editors, but it must be converted before packaging.

The positioning gap matters more than it looks. SRT cues always land in the player's default region, which on sports and news content means captions sitting on top of the score bug or lower-third graphic. WebVTT line and position settings let a caption editor move a cue up for those seconds, and that information survives the trip to the player.

## **How to convert SRT to VTT without breaking timing**

An SRT to VTT conversion is mechanical, which is why it goes wrong quietly. The steps below are what ffmpeg and most caption libraries do; check each one in your own converter.

1. Normalize the encoding to UTF-8. SRT files exported on Windows are often Windows-1252, and accented characters turn into replacement glyphs after conversion.
2. Add the WEBVTT header as the first line, followed by a blank line.
3. Replace the comma before milliseconds with a period in every timing line. Leave the hour field in place; it is optional in WebVTT, not forbidden.
4. Keep or drop cue numbers. WebVTT treats them as cue identifiers, so they are harmless.
5. Strip font tags and any non-standard positioning codes that some SRT editors insert, since WebVTT parsers either display them as text or reject the cue.
6. Apply any program offset. If the video was trimmed or has a pre-roll slate, shift every cue by the same amount before segmenting.

Validate the result with a strict WebVTT parser, not just a player. Lenient players hide malformed cues that a smart TV client will drop.

## **CEA-608 and CEA-708 in live streams**

Live captions usually originate as 608 data from a human stenographer or a speech-to-text service, inserted into SDI ancillary data (SMPTE 334) or handed directly to the encoder. The video encoder copies those bytes into SEI messages frame by frame, and the packager passes them through untouched into HLS or DASH segments.

This path has two properties that sidecar formats cannot match. Captions are frame-locked to video, so they cannot drift, and they survive every hop to a set-top box or a broadcast return feed. The cost is presentation: 608 roll-up captions, 32 columns wide, look dated in a modern web player, and browser players commonly decode 608 while fewer decode 708.

Accessibility obligations reinforce the choice. In the US, FCC rules under the CVAA require captions on internet video that aired on television with captions, and WCAG 2.x success criterion 1.2.4 requires captions for live audio at level AA. Passing through the broadcast 608 track is the lowest-risk way to stay compliant.

## **How to package streaming captions for HLS and DASH**

### HLS

For in-band captions, the multivariant playlist declares an EXT-X-MEDIA entry with TYPE set to CLOSED-CAPTIONS, a GROUP-ID, and an INSTREAM-ID of CC1 to CC4 for 608 or SERVICE1 to SERVICE63 for 708. Each EXT-X-STREAM-INF then references that group in its CLOSED-CAPTIONS attribute, or sets it to NONE when a variant carries no captions, so players do not wait for data that never arrives.

For WebVTT, the playlist declares an EXT-X-MEDIA entry with TYPE set to SUBTITLES, a LANGUAGE, a NAME, and a URI pointing to a separate subtitle media playlist. Each WebVTT segment carries an X-TIMESTAMP-MAP header that maps an MPEGTS value on the 90 kHz clock to a local cue time. That header is the single most common source of caption sync bugs.

### DASH

DASH gives three options. A single sidecar WebVTT file in an AdaptationSet with mimeType text/vtt works for VOD in dash.js and Shaka Player but is unusable for live. Segmented text in fMP4, either IMSC1 (codec stpp) or WebVTT in ISOBMFF (codec wvtt, ISO/IEC 14496-30), works for both, and DASH-IF guidance favors IMSC1. In-band 608 is signaled with an Accessibility descriptor using the scheme urn:scte:dash:cc:cea-608:2015 and a value such as CC1=eng.

## **What streaming captions cost at the CDN: the request math**

Sidecar captions are almost free in bytes and expensive in requests. Take a live event with 50,000 concurrent viewers for two hours, 6-second segments, demuxed audio and a 5 Mb/s top rendition. Without subtitles each viewer fetches four objects per segment interval: a video segment, a video playlist reload, an audio segment and an audio playlist reload.

Adding a WebVTT rendition adds a subtitle segment and a subtitle playlist reload per interval, a 50% increase in request rate. Our arithmetic: 2 extra requests times 600 intervals per hour is 1,200 per viewer-hour, so 50,000 viewers over 2 hours generate 120 million extra requests. At roughly 500 bytes per subtitle segment and about 1 KB per playlist, that is around 90 GB (estimate) against 225 TB of video, about 0.04% of bytes.

On request-billed CDNs that charge on the order of $0.01 per 10,000 HTTPS requests (an estimate for 2026 list rates), those captions add about $120 to the event. The larger risk is origin load: subtitle playlists have short TTLs and every edge miss lands on the packager at the same moment. BlazingCDN bills transfer only, with [**no request fees and unlimited requests on BlazingCDN pricing**](https://blazingcdn.com/pricing/), and its origin shield and request coalescing collapse concurrent playlist misses into one origin fetch. In-band 608 avoids the question entirely: zero extra requests.

## **Trade-offs and failure modes**

- **Fixed caption offset in HLS:** captions consistently early or late by exactly 10 seconds usually means the X-TIMESTAMP-MAP MPEGTS value (900000 is 10 seconds at 90 kHz) does not match the first video PTS.
- **Captions missing in browsers only:** sidecar tracks are fetched cross-origin, so a missing Access-Control-Allow-Origin header on text/vtt responses kills them while native apps still work.
- **Wrong Content-Type:** some smart TV players reject WebVTT served as text/plain or application/octet-stream.
- **Live 608 to WebVTT conversion:** roll-up captions become a stream of overlapping, one-word cues; budget a cue merging step or keep 608 as the primary track.
- **Language ceiling:** 608 offers four channels and no CJK, Arabic or Cyrillic, so multilingual services need WebVTT or IMSC1 regardless.

To verify this on your stack, check the Content-Type and Access-Control-Allow-Origin headers on one subtitle segment, compare the X-TIMESTAMP-MAP value to the first video PTS, and look at the cache hit ratio for subtitle playlists separately from video playlists.

## **Recommendation matrix: which caption format fits which workload**

| Workload | Best fit | Packaging | Why |
| --- | --- | --- | --- |
| Web and mobile VOD on HLS | Segmented WebVTT | SUBTITLES rendition per language | Native in Safari, AVPlayer and hls.js |
| Multi-device VOD on DASH | IMSC1 in fMP4 | Text AdaptationSet, codec stpp | DASH-IF guidance and smart TV support |
| Live channel simulcast with broadcast | CEA-608 plus 708 in-band | CLOSED-CAPTIONS group or Accessibility descriptor | Frame-locked, zero extra requests |
| Multilingual live events | 608 primary, WebVTT for other languages | Both groups in one playlist | 608 cannot carry non-Latin scripts |
| Caption authoring and vendor exchange | SRT or WebVTT source files | Convert at ingest | Universal tool support |

No single caption format covers every workload, so the practical default is WebVTT for sidecar delivery and in-band 608 wherever a broadcast path exists.

## **FAQ: WebVTT, SRT and CEA-608 streaming captions**

### How do I convert SRT to VTT for HLS?

Convert SRT to VTT by adding the WEBVTT header, changing the comma before milliseconds to a period, and saving as UTF-8. For HLS you then segment the WebVTT file to match the video segment duration and add an X-TIMESTAMP-MAP header to each segment so cue times align with the video presentation timestamps.

### Can HLS use SRT subtitles directly?

No, HLS cannot reference SRT subtitle files directly. RFC 8216 defines WebVTT as the text subtitle format for HLS renditions, and players such as Safari, AVPlayer and hls.js expect it. Some desktop players load local SRT files, but any streaming pipeline must convert SRT to WebVTT or IMSC1 before writing the playlist.

### What is the difference between CEA-608 and CEA-708 captions?

CEA-608 is the older line 21 caption standard with four channels, a fixed 32-column grid and a Western European character set. CEA-708 is the digital successor with up to 63 caption services, windows, colors and fonts. Streams usually carry both, because 708 data includes 608 compatibility bytes for older decoders.

### Do WebVTT captions work in DASH streams?

Yes, WebVTT works in DASH either as a single sidecar text/vtt file or as WebVTT in fMP4 segments with the wvtt codec. The sidecar option suits VOD only. For live DASH and broad smart TV coverage, DASH-IF guidance favors IMSC1 text in fMP4 segments, signaled with the stpp codec string.

### Should live streams use WebVTT or CEA-608 captions?

Live streams that also feed broadcast or set-top boxes should keep CEA-608 in-band, because it is frame-locked to video and adds no requests. Add a WebVTT rendition when you need languages 608 cannot carry or better on-screen presentation, and test that segmented WebVTT timing stays aligned through encoder restarts.

## **Audit your caption delivery before the next live event**

Pick one VOD title and one live channel and run three checks this week. Confirm every subtitle response carries text/vtt and a CORS header, compare each segment's X-TIMESTAMP-MAP value to the first video PTS, and count requests per viewer-hour with and without the subtitle rendition in your CDN logs. Multiply that delta by your peak concurrency and your provider's request fee to see what captions actually cost you, then decide whether in-band 608 should carry more of the load.

If your video and caption renditions are already packaged, the [**BlazingCDN HLS Streaming CDN for pre-encoded HLS, LL-HLS and DASH**](https://blazingcdn.com/streaming-cdn/) delivers them with no request fees, and its 14-day testing period on real production traffic is enough to repeat this audit on your own segments.

Share: [f](https://www.facebook.com/sharer/sharer.php?u=https://blog.blazingcdn.com/en-us/captions-for-streaming-video-webvtt-srt-and-cea-608) [in](https://www.linkedin.com/sharing/share-offsite/?url=https://blog.blazingcdn.com/en-us/captions-for-streaming-video-webvtt-srt-and-cea-608) [𝕏](https://twitter.com/intent/tweet?url=https://blog.blazingcdn.com/en-us/captions-for-streaming-video-webvtt-srt-and-cea-608&text=) [✉](mailto:?subject=%3Cspan%20id="hs_cos_wrapper_name"%20class="hs_cos_wrapper%20hs_cos_wrapper_meta_field%20hs_cos_wrapper_type_text"%20style=""%20data-hs-cos-general-type="meta_field"%20data-hs-cos-type="text"%20%3ECaptions%20for%20Streaming%20Video:%20WebVTT,%20SRT%20and%20CEA-608%3C/span%3E&body=https://blog.blazingcdn.com/en-us/captions-for-streaming-video-webvtt-srt-and-cea-608)

![BlazingCDN](https://blog.blazingcdn.com/hs-fs/hubfs/Logo/blog-logo-w.png?height=24&name=blog-logo-w.png)

*Heavy traffic.*  
Light bill.

The CDN for video and large traffic

Their monthly bill vs ours

- 20 TBFastly $2,087**$92.50**
- 50 TBCDN77 $990**$215**
- 200 TBCloudFront $11,965**$765**

Published list prices, Aug 2026

[Calculate your cost](https://blazingcdn.com/cdn-cost-calculator/?utm_source=blog&utm_medium=sidebar&utm_campaign=blog_sidebar&utm_content=compare_calc)

## Related posts

[![](https://blog.blazingcdn.com/hubfs/Gemini-Blog/image-Oct-31-2026-08-25-13-2803-PM.jpeg)](https://blog.blazingcdn.com/en-us/cdn-internet-backbone-explained-anycast-ixps-tier-1-networks?hsLang=en-us)

Learn

### [CDN Internet Backbone Explained: Anycast, IXPs and Tier 1 Networks](https://blog.blazingcdn.com/en-us/cdn-internet-backbone-explained-anycast-ixps-tier-1-networks?hsLang=en-us)

Light in fiber covers about 200 km per millisecond, so every 1,000 km of path adds roughly 10 ms of round-trip time ...

Oct 31, 2026, 9:27:25 PM [Read more](https://blog.blazingcdn.com/en-us/cdn-internet-backbone-explained-anycast-ixps-tier-1-networks?hsLang=en-us)

[![](https://blog.blazingcdn.com/hubfs/Gemini-Blog/image-Oct-31-2026-07-55-16-1358-PM.jpeg)](https://blog.blazingcdn.com/en-us/whats-difference-between-p2p-and-cdn?hsLang=en-us)

Compare

### [P2P CDN vs Traditional CDN: Differences, Pros, Cons and Uses](https://blog.blazingcdn.com/en-us/whats-difference-between-p2p-and-cdn?hsLang=en-us)

A peer-to-peer CDN offloads delivery to viewers' own devices, but in 2026 its savings depend more on your CDN's price ...

Oct 31, 2026, 8:57:38 PM [Read more](https://blog.blazingcdn.com/en-us/whats-difference-between-p2p-and-cdn?hsLang=en-us)

[![BlazingCDN](https://blog.blazingcdn.com/hubfs/Logo/blog-logo-w.png)](https://blog.blazingcdn.com?hsLang=en-us)

[📘 Learn](https://blog.blazingcdn.com/cdn-learn?hsLang=en-us) [📊 Benchmarks](https://blog.blazingcdn.com/cdn-ratings-and-benchmarks?hsLang=en-us) [🎬 Video & Streaming](https://blog.blazingcdn.com/video-streaming-cdn?hsLang=en-us) [🏭 Industries](https://blog.blazingcdn.com/cdn-industry-insights?hsLang=en-us) [💰 Pricing & Costs](https://blog.blazingcdn.com/cdn-pricing-and-cdn-costs?hsLang=en-us) [⚡ Compare](https://blog.blazingcdn.com/cdn-comparison?hsLang=en-us) [🔒 Security](https://blog.blazingcdn.com/cdn-security?hsLang=en-us) [🛠️ Tools](https://blog.blazingcdn.com/cdn-tools?hsLang=en-us) [✍️ Publish with us](https://blog.blazingcdn.com/publish-with-us?hsLang=en-us)

in f 𝕏 ✉

 Copyright © BlazingCDN |. All rights reserved.

```json
{
  "@context" : "https://schema.org",
  "@id" : "https://blazingcdn.com/#organization",
  "@type" : "Organization",
  "description" : "High-volume CDN for video, live streaming, OTT/IPTV, software, games, SaaS and large-file delivery.",
  "logo" : {
    "@id" : "https://blazingcdn.com/#logo",
    "@type" : "ImageObject",
    "height" : 560,
    "url" : "https://blazingcdn.com/wp-content/uploads/2024/08/logo-560-560.png",
    "width" : 560
  },
  "name" : "BlazingCDN",
  "sameAs" : [ "https://www.linkedin.com/company/blazingcdn", "https://x.com/BlazingCdn", "https://www.reddit.com/r/BlazingCDN/", "https://www.wikidata.org/wiki/Q141711074" ],
  "url" : "https://blazingcdn.com/"
}
```

```json
{
  "@context" : "https://schema.org",
  "@id" : "https://blog.blazingcdn.com/#website",
  "@type" : "WebSite",
  "inLanguage" : "en-US",
  "name" : "BlazingCDN Blog",
  "publisher" : {
    "@id" : "https://blazingcdn.com/#organization"
  },
  "url" : "https://blog.blazingcdn.com/"
}
```

```json
{
  "@context" : "https://schema.org",
  "@id" : "https://blog.blazingcdn.com/en-us/captions-for-streaming-video-webvtt-srt-and-cea-608#article",
  "@type" : "BlogPosting",
  "author" : {
    "@id" : "https://blog.blazingcdn.com/en-us/author/blazingcdn#person",
    "@type" : "Person",
    "description" : "Vadym Borovskyi is Chief Product and Marketing Officer at BlazingCDN, where he has led product strategy and growth since 2021. He has more than 11 years of experience in IT product management and B2B marketing. On this blog he writes about CDN pricing and egress costs, video and software delivery, cache configuration, and how teams evaluate and switch CDN providers. He is based in Warsaw, Poland.",
    "image" : "https://143144902.fs1.hubspotusercontent-eu1.net/hubfs/143144902/vadym-borovskyi.jpg",
    "jobTitle" : "Chief Product and Marketing Officer",
    "knowsAbout" : [ "Content Delivery Networks (CDN)", "CDN pricing", "Video streaming delivery", "Software and game distribution", "Cache optimization", "Product Management", "B2B Marketing", "Digital Marketing", "Pay Per Click Marketing (PPC)", "Google Ads", "Search Engine Marketing (SEM)", "Marketing Strategy", "Artificial Intelligence (AI)", "Cloud Management", "SaaS Development", "IT Consulting", "Computer Networking", "Project Management", "Startups" ],
    "name" : "Vadym Borovskyi",
    "sameAs" : [ "https://www.linkedin.com/in/axelt/" ],
    "url" : "https://blog.blazingcdn.com/en-us/author/blazingcdn",
    "worksFor" : {
      "@id" : "https://blazingcdn.com/#organization"
    }
  },
  "dateModified" : "2026-10-31T20:33:28Z",
  "datePublished" : "2026-10-31T20:33:28Z",
  "description" : "Learn streaming captions with WebVTT, SRT, and CEA-608, including SRT to VTT conversion and SRT vs VTT differences.",
  "headline" : "Captions for Streaming Video: WebVTT, SRT and CEA-608",
  "image" : "https://143144902.fs1.hubspotusercontent-eu1.net/hubfs/143144902/Gemini-Blog/image-Oct-31-2026-08-30-37-0229-PM.jpeg",
  "inLanguage" : "en-us",
  "isPartOf" : {
    "@id" : "https://blog.blazingcdn.com/#website"
  },
  "mainEntityOfPage" : {
    "@id" : "https://blog.blazingcdn.com/en-us/captions-for-streaming-video-webvtt-srt-and-cea-608",
    "@type" : "WebPage"
  },
  "publisher" : {
    "@id" : "https://blazingcdn.com/#organization"
  },
  "wordCount" : 2275
}
```

```json
{
  "@context" : "https://schema.org",
  "@id" : "https://blog.blazingcdn.com/en-us/captions-for-streaming-video-webvtt-srt-and-cea-608#breadcrumb",
  "@type" : "BreadcrumbList",
  "itemListElement" : [ {
    "@type" : "ListItem",
    "item" : "https://blog.blazingcdn.com/en-us",
    "name" : "Blog",
    "position" : 1
  }, {
    "@type" : "ListItem",
    "item" : "https://blog.blazingcdn.com/en-us/captions-for-streaming-video-webvtt-srt-and-cea-608",
    "name" : "Captions for Streaming Video: WebVTT, SRT and CEA-608",
    "position" : 2
  } ]
}
```

```json
{
  "@context" : "https://schema.org",
  "@id" : "https://blog.blazingcdn.com/en-us/captions-for-streaming-video-webvtt-srt-and-cea-608#faq",
  "@type" : "FAQPage",
  "mainEntity" : [ {
    "@type" : "Question",
    "acceptedAnswer" : {
      "@type" : "Answer",
      "text" : "Convert SRT to VTT by adding the WEBVTT header, changing the comma before milliseconds to a period, and saving as UTF-8. For HLS you then segment the WebVTT file to match the video segment duration and add an X-TIMESTAMP-MAP header to each segment so cue times align with the video presentation timestamps."
    },
    "name" : "How do I convert SRT to VTT for HLS?"
  }, {
    "@type" : "Question",
    "acceptedAnswer" : {
      "@type" : "Answer",
      "text" : "No, HLS cannot reference SRT subtitle files directly. RFC 8216 defines WebVTT as the text subtitle format for HLS renditions, and players such as Safari, AVPlayer and hls.js expect it. Some desktop players load local SRT files, but any streaming pipeline must convert SRT to WebVTT or IMSC1 before writing the playlist."
    },
    "name" : "Can HLS use SRT subtitles directly?"
  }, {
    "@type" : "Question",
    "acceptedAnswer" : {
      "@type" : "Answer",
      "text" : "CEA-608 is the older line 21 caption standard with four channels, a fixed 32-column grid and a Western European character set. CEA-708 is the digital successor with up to 63 caption services, windows, colors and fonts. Streams usually carry both, because 708 data includes 608 compatibility bytes for older decoders."
    },
    "name" : "What is the difference between CEA-608 and CEA-708 captions?"
  }, {
    "@type" : "Question",
    "acceptedAnswer" : {
      "@type" : "Answer",
      "text" : "Yes, WebVTT works in DASH either as a single sidecar text/vtt file or as WebVTT in fMP4 segments with the wvtt codec. The sidecar option suits VOD only. For live DASH and broad smart TV coverage, DASH-IF guidance favors IMSC1 text in fMP4 segments, signaled with the stpp codec string."
    },
    "name" : "Do WebVTT captions work in DASH streams?"
  }, {
    "@type" : "Question",
    "acceptedAnswer" : {
      "@type" : "Answer",
      "text" : "Live streams that also feed broadcast or set-top boxes should keep CEA-608 in-band, because it is frame-locked to video and adds no requests. Add a WebVTT rendition when you need languages 608 cannot carry or better on-screen presentation, and test that segmented WebVTT timing stays aligned through encoder restarts."
    },
    "name" : "Should live streams use WebVTT or CEA-608 captions?"
  } ]
}
```