BETA: WebVTT caption support for HLS Custom Sources

In the latest DVR pre-release we have launched support for handling WebVTT captions from HLS-based Custom Sources. There are some FAST channels that use these WebVTT captions that will now be visible in clients.

NOTE: The captions will not be visible in the web client and will not be visible to other players.

Please let us know if you run into any issues trying to use them.

7 Likes

Had cancelled my sub ending in June due to all my sources now being webvtt, but may re-enable - dis not realise this was on the horizon with some of the other threads about webvtt dating back a number of years.

Would love to know how the DVR would handle these streams. Will the format remain whatever is in the HLS (ts/mp4) and the subs be written to a .vtt file?

Would be a no brainer to re-enable if the DVR would handle keeping the subs!

Cool, looking forward to testing this out.

Which ones? Any examples to start with?

The text of the WebVTT captions are being remuxed into the MPEG-TS directly to work with the rest of our infrastructure.

Oh okay.

So webvtt recordings will work (display subs) within channels clients - but not outside? I assumed you meant for m3u export it wouldn't be visible - but are you meaning recordings?

Correct. The way they're muxing them into the MPEG-TS is using a private data PES of type xVTT that is not going to be used by anything other than their client players to extract them.
No other players or cc/sub rip utilities will work.

Screenshot 2026-03-31 092633
Screenshot 2026-03-31 092559

Pluto Recording > View Details

@eric does WebVTT play any role in comskip detecting commericals ?

@slampman yes, comskip will see the captions and that will be able to help Enhanced Commercial Detection.

@eric will MPEG-TS ever support Webvtt? Most of the sources im doing some dev work on are MPEG-TS. I am looking at moving them to hls but if mpeg support is coming i will hold off.

Seriously thank you so much for this.

2 Likes

@eric I'm playing around with this. converted my source to hls and have been playing around trying to get the WebVTT captions to work. I keep hitting a panic recovered error whenever there's a subtitle track in the master playlist. It works fine without it. Am I missing something in how the subtitle playlist needs to be formatted?

2026/04/01 19:11:42 [Recovery] 2026/04/01 - 19:11:42 panic recovered:
runtime error: invalid memory address or nil pointer dereference
runtime/panic.go:262 (0x486718)
runtime/signal_unix.go:925 (0x4866e8)
github.com/fancybits/channels-server/hls/remuxer.go:174 (0x1324943)
github.com/fancybits/channels-server/hls/reader.go:305 (0x131bab8)
github.com/fancybits/channels-server/hls/reader.go:509 (0x131cd84)
github.com/fancybits/channels-server/tuner/stream.go:582 (0x13492b9)
github.com/fancybits/channels-server/tuner/stream.go:446 (0x1348424)
io/io.go:429 (0x49d2cf)
io/io.go:388 (0x28865ec)
github.com/fancybits/channels-server/http_device.go:800 (0x2886178)
github.com/fancybits/channels-server/http_device.go:809 (0x28846b9)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/fancybits/channels-server/http_device.go:112 (0x2804584)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/fancybits/channels-server/http.go:420 (0x27f38b2)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/fancybits/channels-server/http.go:397 (0x27f356f)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/fancybits/channels-server/http.go:372 (0x27f3227)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/fancybits/channels-server/http.go:334 (0x27f25b0)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/gin-gonic/[email protected]/recovery.go:101 (0x18ba2b0)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/gin-gonic/[email protected]/logger.go:249 (0x18b93c9)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/gin-contrib/[email protected]/sessions.go:54 (0x27f6964)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/fancybits/channels-server/http.go:596 (0x2894d2e)
github.com/gin-gonic/[email protected]/context.go:192 (0x18ab56d)
github.com/gin-gonic/[email protected]/gin.go:689 (0x18b83f4)
github.com/gin-gonic/[email protected]/gin.go:643 (0x18b7d8c)
net/http/server.go:3340 (0x76cf6d)
net/http/server.go:2109 (0x74b764)
runtime/asm_amd64.s:1693 (0x48c740)

@slampman Please submit diagnostics.

sure thing e3f6f6bf-2592-4769-b91e-db926e7d484d

I'm using AI to try and work with this so if you have example of a working WebVTT subtitle playlist format that Channels likes I could try and replicate that :slight_smile:

This should fix your panic.

1 Like

Can webvtt now be passed through if outputting via hls instead of format=ts for M3U export?
Eg with something like scodec=vtt?

No, it's not something that we'll likely be able to do in the near term.