Jellyfin does not transcode Live TV stream in browser (Chrome) when playback should be possible #7661

Open
opened 2026-02-07 05:18:17 +03:00 by OVERLORD · 7 comments
Owner

Originally created by @nothing2obvi on GitHub (Nov 1, 2025).

Description of the bug

When playing a Live TV channel provided by ErsatzTV (HLS Direct), Jellyfin fails to play the stream at all in a web browser (Google Chrome).

Instead of attempting to transcode to a supported format (as Jellyfin normally would for HEVC content in browsers), the stream simply fails to play.

The same Live TV channel:

  • Remuxes correctly on Jellyfin Android TV (transcoding disabled)
  • Transcodes (likely erroneously, see #15337) on Jellyfin Media Player and Streamyfin.
  • Fails to play entirely on Chrome — Jellyfin does not initiate transcoding.

This suggests that the browser playback path for Live TV HLS Direct sources does not properly fall back to transcoding when direct playback is unsupported.

I do not wish to enable force transcoding of live TV because I have at least one client that can direct play it.

Reproduction steps

  1. Configure ErsatzTV as a Live TV source in Jellyfin, using HLS Direct mode.
  2. Confirm the Live TV channel’s source codec is HEVC (H.265).
  3. Open Jellyfin Web (Chrome) and attempt to play the channel.
  4. Observe that playback fails to start, and no transcoding session is triggered in logs or the dashboard.
  5. Attempt the same channel on other clients:
  6. Jellyfin Android TV → Remuxes successfully
  7. Jellyfin Media Player / Streamyfin → Transcodes
  8. Chrome → Does not play or transcode

What is the current bug behavior?

  • Playback fails completely on Chrome.
  • Jellyfin does not attempt to transcode unsupported HEVC Live TV streams to a browser-compatible format.
  • No FFmpeg process is started for Live TV playback in browser sessions.

What is the expected correct behavior?

  • When a browser client (e.g., Chrome) cannot Direct Play the source format, Jellyfin should automatically transcode the Live TV stream to a supported codec/container (e.g., H.264/AAC in MP4 or HLS).
  • Playback should succeed, just as it does for regular library items with the same codec.

Jellyfin Server version

10.10.0+

Specify commit id

No response

Specify unstable release number

No response

Specify version number

No response

Specify the build version

10.11.1

Environment

- OS: macOS Tahoe 26.0.1
- Linux Kernel:
- Virtualization:
- Clients: Jellyfin Web
- Browser: Google Chrome 142.0.7444.60
- FFmpeg Version:
- Playback Method: 
- Hardware Acceleration: Video ToolBox
- GPU Model: M4 Mac mini
- Plugins:
- Reverse Proxy:
- Base URL:
- Networking:
- Jellyfin Data Storage:
- Media Storage:
- External Integrations:

Jellyfin logs

[2025-10-31 22:16:30.863 -07:00] [INF] [42] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "anon_user". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[2025-10-31 22:16:30.863 -07:00] [INF] [42] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 20000000, RemoteIP: "**redacted_ip_local**", IsInLocalNetwork: True
[2025-10-31 22:16:30.866 -07:00] [INF] [42] Jellyfin.LiveTv.LiveTvMediaSourceProvider: Opening channel stream from "Emby", external channel Id: "m3u_********"
[2025-10-31 22:16:30.866 -07:00] [INF] [42] Jellyfin.LiveTv.DefaultLiveTvService: Streaming Channel "m3u_********"
[2025-10-31 22:16:30.866 -07:00] [INF] [42] Jellyfin.LiveTv.DefaultLiveTvService: Live stream "********" consumer count is now 13
[2025-10-31 22:16:30.868 -07:00] [INF] [50] Emby.Server.Implementations.Library.MediaSourceManager: Live tv media info probe took "0.000807" seconds
[2025-10-31 22:16:30.869 -07:00] [INF] [50] Emby.Server.Implementations.Library.MediaSourceManager: Live stream opened: MediaSourceInfo { Protocol: Http, Id: "********", Path: "http://localhost:8409/iptv/channel/8.m3u8?mode=hls-direct", EncoderPath: null, EncoderProtocol: null, Type: Default, Container: "hls", Size: 163, ... Bitrate: 20320000, FallbackMaxStreamingBitrate: 20000000, ... DisplayTitle: "1080p HEVC SDR", Profile: "Main 10", PixelFormat: "yuv420p10le" }
[2025-10-31 22:16:30.869 -07:00] [INF] [50] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "anon_user". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[2025-10-31 22:16:30.869 -07:00] [INF] [50] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 20000000, RemoteIP: "**redacted_ip_local**", IsInLocalNetwork: True
[2025-10-31 22:16:46.781 -07:00] [INF] [49] Emby.Server.Implementations.HttpServer.WebSocketManager: WS "**redacted_ip_local**" closed
[2025-10-31 22:16:52.648 -07:00] [INF] [37] Jellyfin.Plugin.Streamyfin.PushNotifications.Events.SessionStartEvent: SessionStartEvent received but currently disabled.
[2025-10-31 22:16:53.191 -07:00] [INF] [29] Emby.Server.Implementations.HttpServer.WebSocketManager: WS "**redacted_ip_local**" request
[2025-10-31 22:17:00.120 -07:00] [INF] [50] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "anon_user". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[2025-10-31 22:17:00.121 -07:00] [INF] [50] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 20000000, RemoteIP: "**redacted_ip_local**", IsInLocalNetwork: True
[2025-10-31 22:17:00.122 -07:00] [INF] [50] Jellyfin.LiveTv.LiveTvMediaSourceProvider: Opening channel stream from "Emby", external channel Id: "m3u_********"
[2025-10-31 22:17:00.122 -07:00] [INF] [50] Jellyfin.LiveTv.DefaultLiveTvService: Streaming Channel "m3u_********"
[2025-10-31 22:17:00.122 -07:00] [INF] [50] Jellyfin.LiveTv.DefaultLiveTvService: Live stream "********" consumer count is now 14
[2025-10-31 22:17:00.122 -07:00] [INF] [35] Emby.Server.Implementations.Library.MediaSourceManager: Live tv media info probe took "0.000358" seconds
[2025-10-31 22:17:00.123 -07:00] [INF] [35] Emby.Server.Implementations.Library.MediaSourceManager: Live stream opened: MediaSourceInfo { Protocol: Http, Id: "********", Path: "http://localhost:8409/iptv/channel/8.m3u8?mode=hls-direct", Container: "hls", Bitrate: 20320000, FallbackMaxStreamingBitrate: 20000000, ... DisplayTitle: "1080p HEVC SDR", Profile: "Main 10", PixelFormat: "yuv420p10le" }
[2025-10-31 22:17:00.123 -07:00] [INF] [35] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "anon_user". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[2025-10-31 22:17:00.123 -07:00] [INF] [35] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 20000000, RemoteIP: "**redacted_ip_local**", IsInLocalNetwork: True

FFmpeg logs


Client / Browser logs

No response

Relevant screenshots or videos

No response

Additional information

No response

Originally created by @nothing2obvi on GitHub (Nov 1, 2025). ### Description of the bug When playing a Live TV channel provided by ErsatzTV (HLS Direct), Jellyfin fails to play the stream at all in a web browser (Google Chrome). Instead of attempting to transcode to a supported format (as Jellyfin normally would for HEVC content in browsers), the stream simply fails to play. The same Live TV channel: - Remuxes correctly on Jellyfin Android TV (transcoding disabled) - Transcodes (likely erroneously, see #15337) on Jellyfin Media Player and Streamyfin. - Fails to play entirely on Chrome — Jellyfin does not initiate transcoding. This suggests that the browser playback path for Live TV HLS Direct sources does not properly fall back to transcoding when direct playback is unsupported. I do not wish to enable force transcoding of live TV because I have at least one client that can direct play it. ### Reproduction steps 1. Configure ErsatzTV as a Live TV source in Jellyfin, using HLS Direct mode. 2. Confirm the Live TV channel’s source codec is HEVC (H.265). 3. Open Jellyfin Web (Chrome) and attempt to play the channel. 4. Observe that playback fails to start, and no transcoding session is triggered in logs or the dashboard. 5. Attempt the same channel on other clients: 6. Jellyfin Android TV → Remuxes successfully 7. Jellyfin Media Player / Streamyfin → Transcodes 8. Chrome → Does not play or transcode ### What is the current _bug_ behavior? - Playback fails completely on Chrome. - Jellyfin does not attempt to transcode unsupported HEVC Live TV streams to a browser-compatible format. - No FFmpeg process is started for Live TV playback in browser sessions. ### What is the expected _correct_ behavior? - When a browser client (e.g., Chrome) cannot Direct Play the source format, Jellyfin should automatically transcode the Live TV stream to a supported codec/container (e.g., H.264/AAC in MP4 or HLS). - Playback should succeed, just as it does for regular library items with the same codec. ### Jellyfin Server version 10.10.0+ ### Specify commit id _No response_ ### Specify unstable release number _No response_ ### Specify version number _No response_ ### Specify the build version 10.11.1 ### Environment ```markdown - OS: macOS Tahoe 26.0.1 - Linux Kernel: - Virtualization: - Clients: Jellyfin Web - Browser: Google Chrome 142.0.7444.60 - FFmpeg Version: - Playback Method: - Hardware Acceleration: Video ToolBox - GPU Model: M4 Mac mini - Plugins: - Reverse Proxy: - Base URL: - Networking: - Jellyfin Data Storage: - Media Storage: - External Integrations: ``` ### Jellyfin logs ```shell [2025-10-31 22:16:30.863 -07:00] [INF] [42] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "anon_user". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True [2025-10-31 22:16:30.863 -07:00] [INF] [42] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 20000000, RemoteIP: "**redacted_ip_local**", IsInLocalNetwork: True [2025-10-31 22:16:30.866 -07:00] [INF] [42] Jellyfin.LiveTv.LiveTvMediaSourceProvider: Opening channel stream from "Emby", external channel Id: "m3u_********" [2025-10-31 22:16:30.866 -07:00] [INF] [42] Jellyfin.LiveTv.DefaultLiveTvService: Streaming Channel "m3u_********" [2025-10-31 22:16:30.866 -07:00] [INF] [42] Jellyfin.LiveTv.DefaultLiveTvService: Live stream "********" consumer count is now 13 [2025-10-31 22:16:30.868 -07:00] [INF] [50] Emby.Server.Implementations.Library.MediaSourceManager: Live tv media info probe took "0.000807" seconds [2025-10-31 22:16:30.869 -07:00] [INF] [50] Emby.Server.Implementations.Library.MediaSourceManager: Live stream opened: MediaSourceInfo { Protocol: Http, Id: "********", Path: "http://localhost:8409/iptv/channel/8.m3u8?mode=hls-direct", EncoderPath: null, EncoderProtocol: null, Type: Default, Container: "hls", Size: 163, ... Bitrate: 20320000, FallbackMaxStreamingBitrate: 20000000, ... DisplayTitle: "1080p HEVC SDR", Profile: "Main 10", PixelFormat: "yuv420p10le" } [2025-10-31 22:16:30.869 -07:00] [INF] [50] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "anon_user". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True [2025-10-31 22:16:30.869 -07:00] [INF] [50] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 20000000, RemoteIP: "**redacted_ip_local**", IsInLocalNetwork: True [2025-10-31 22:16:46.781 -07:00] [INF] [49] Emby.Server.Implementations.HttpServer.WebSocketManager: WS "**redacted_ip_local**" closed [2025-10-31 22:16:52.648 -07:00] [INF] [37] Jellyfin.Plugin.Streamyfin.PushNotifications.Events.SessionStartEvent: SessionStartEvent received but currently disabled. [2025-10-31 22:16:53.191 -07:00] [INF] [29] Emby.Server.Implementations.HttpServer.WebSocketManager: WS "**redacted_ip_local**" request [2025-10-31 22:17:00.120 -07:00] [INF] [50] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "anon_user". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True [2025-10-31 22:17:00.121 -07:00] [INF] [50] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 20000000, RemoteIP: "**redacted_ip_local**", IsInLocalNetwork: True [2025-10-31 22:17:00.122 -07:00] [INF] [50] Jellyfin.LiveTv.LiveTvMediaSourceProvider: Opening channel stream from "Emby", external channel Id: "m3u_********" [2025-10-31 22:17:00.122 -07:00] [INF] [50] Jellyfin.LiveTv.DefaultLiveTvService: Streaming Channel "m3u_********" [2025-10-31 22:17:00.122 -07:00] [INF] [50] Jellyfin.LiveTv.DefaultLiveTvService: Live stream "********" consumer count is now 14 [2025-10-31 22:17:00.122 -07:00] [INF] [35] Emby.Server.Implementations.Library.MediaSourceManager: Live tv media info probe took "0.000358" seconds [2025-10-31 22:17:00.123 -07:00] [INF] [35] Emby.Server.Implementations.Library.MediaSourceManager: Live stream opened: MediaSourceInfo { Protocol: Http, Id: "********", Path: "http://localhost:8409/iptv/channel/8.m3u8?mode=hls-direct", Container: "hls", Bitrate: 20320000, FallbackMaxStreamingBitrate: 20000000, ... DisplayTitle: "1080p HEVC SDR", Profile: "Main 10", PixelFormat: "yuv420p10le" } [2025-10-31 22:17:00.123 -07:00] [INF] [35] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "anon_user". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True [2025-10-31 22:17:00.123 -07:00] [INF] [35] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 20000000, RemoteIP: "**redacted_ip_local**", IsInLocalNetwork: True ``` ### FFmpeg logs ```shell ``` ### Client / Browser logs _No response_ ### Relevant screenshots or videos _No response_ ### Additional information _No response_
OVERLORD added the buglive-tv labels 2026-02-07 05:18:17 +03:00
Author
Owner

@mmcnutt commented on GitHub (Nov 2, 2025):

I've been having the same issue with Ersatz playback since upgrading to 10.11, can confirm it always attempts to transcode a HLS-Direct Stream and it always fails. The same m3u channel list will work in mpv without issue.

[hls @ 0x7f66062c5500] Skip ('#EXT-X-VERSION:3')
[hls @ 0x7f66062c5500] Skip ('#EXT-X-DISCONTINUITY')
[hls @ 0x7f66062c5500] URL http://redacted:8409/iptv/hls-direct/47?index=1 is not in allowed_segment_extensions
[in#0 @ 0x7f66063e6c00] Error opening input: Invalid data found when processing input
Error opening input file http://redacted:8409/iptv/channel/47.m3u8?mode=hls-direct.
Error opening input files: Invalid data found when processing input

@mmcnutt commented on GitHub (Nov 2, 2025): I've been having the same issue with Ersatz playback since upgrading to 10.11, can confirm it always attempts to transcode a HLS-Direct Stream and it always fails. The same m3u channel list will work in mpv without issue. [hls @ 0x7f66062c5500] Skip ('#EXT-X-VERSION:3') [hls @ 0x7f66062c5500] Skip ('#EXT-X-DISCONTINUITY') [hls @ 0x7f66062c5500] URL http://redacted:8409/iptv/hls-direct/47?index=1 is not in allowed_segment_extensions [in#0 @ 0x7f66063e6c00] Error opening input: Invalid data found when processing input Error opening input file http://redacted:8409/iptv/channel/47.m3u8?mode=hls-direct. Error opening input files: Invalid data found when processing input
Author
Owner

@tsr488 commented on GitHub (Nov 3, 2025):

I have the same issue.

This might be caused by this change in ffmpeg:
b753bac08f

It seems to disallow playback of HLS streams if the URL doesn't end with one of these extensions: "3gp,aac,avi,ac3,eac3,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav"

The ErsatzTV URL doesn't look like it has ANY extension, just the channel number (47): "http://redacted:8409/iptv/hls-direct/47?index=1"

@tsr488 commented on GitHub (Nov 3, 2025): I have the same issue. This might be caused by this change in ffmpeg: https://github.com/FFmpeg/FFmpeg/commit/b753bac08f6881b2d3dea8f1ab84c81550f35897 It seems to disallow playback of HLS streams if the URL doesn't end with one of these extensions: "3gp,aac,avi,ac3,eac3,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav" The ErsatzTV URL doesn't look like it has ANY extension, just the channel number (47): "http://redacted:8409/iptv/hls-direct/47?index=1"
Author
Owner

@jasongdove commented on GitHub (Nov 3, 2025):

ETV implemented a workaround (basically faking an extension) here https://github.com/ErsatzTV/ErsatzTV/pull/2570 - the fix is in develop builds now and will be part of the next full release.

@jasongdove commented on GitHub (Nov 3, 2025): ETV implemented a workaround (basically faking an extension) here https://github.com/ErsatzTV/ErsatzTV/pull/2570 - the fix is in develop builds now and will be part of the next full release.
Author
Owner

@nothing2obvi commented on GitHub (Nov 6, 2025):

Hi @jasongdove, I've gotten HLS Direct with an HEVC source to work perfectly with the latest build (v25.8.0-629b3d7d-osx-arm64) with every client except a browser. Thank you for that. That would still make this issue a Jellyfin issue, right? In theory, Jellyfin should detect that it's not compatible with the browser and transcode, I think.

@nothing2obvi commented on GitHub (Nov 6, 2025): Hi @jasongdove, I've gotten HLS Direct with an HEVC source to work perfectly with the latest build (v25.8.0-629b3d7d-osx-arm64) with every client except a browser. Thank you for that. That would still make this issue a Jellyfin issue, right? In theory, Jellyfin should detect that it's not compatible with the browser and transcode, I think.
Author
Owner

@nothing2obvi commented on GitHub (Nov 6, 2025):

Actually a similar issue is occurring for me on Jellyfin Android TV. The server says it's direct streaming (transcoding the audio) but I hear no audio, so perhaps it was actually not transcoded. The video plays fine.

@nothing2obvi commented on GitHub (Nov 6, 2025): Actually a similar issue is occurring for me on Jellyfin Android TV. The server says it's direct streaming (transcoding the audio) but I hear no audio, so perhaps it was actually not transcoded. The video plays fine.
Author
Owner

@jamesremuscat commented on GitHub (Dec 4, 2025):

[Edit to add: Jellyfin 10.11.4]

Just encountered a similar issue with another HLS IPTV provider where the segment URLs have no file extension, so are being rejected by ffmpeg:

[hls @ 0x704fff6b4000] URL https://<some URL>/<long hex identifier>?bcn=1&ca=0&cid=7017247788805233560&dur=6.000000&media_type=C&seen-ad=1&seg_id=184469 is not in allowed_segment_extensions
[hls @ 0x704fff6b4000] parse_playlist error Invalid data found when processing input <some URL>

Since Jellyfin by policy does not allow us to specify custom ffmpeg options the catch-all solution would be to have Jellyfin by default pass -allowed_extensions ALL, which would revert to the pre-7.1.1 behaviour for ffmpeg. (If I understand correctly, in ffmpeg 8 the required option will become -allowed_segment_extensions.)

@jamesremuscat commented on GitHub (Dec 4, 2025): [Edit to add: Jellyfin 10.11.4] Just encountered a similar issue with another HLS IPTV provider where the segment URLs have no file extension, so are being rejected by ffmpeg: ``` [hls @ 0x704fff6b4000] URL https://<some URL>/<long hex identifier>?bcn=1&ca=0&cid=7017247788805233560&dur=6.000000&media_type=C&seen-ad=1&seg_id=184469 is not in allowed_segment_extensions [hls @ 0x704fff6b4000] parse_playlist error Invalid data found when processing input <some URL> ``` Since Jellyfin by policy [does not allow us to specify custom `ffmpeg` options](https://github.com/orgs/jellyfin/discussions/14260#discussioncomment-13409182) the catch-all solution would be to have Jellyfin by default pass `-allowed_extensions ALL`, which would revert to the pre-7.1.1 behaviour for `ffmpeg`. (If I understand correctly, in `ffmpeg` 8 the required option [will become `-allowed_segment_extensions`](https://github.com/FFmpeg/FFmpeg/commit/f99f223eb1ac9a6e36dab0e31756369214b5564f).)
Author
Owner

@jamesremuscat commented on GitHub (Dec 4, 2025):

Just tested further and all three of the following options are required for Jellyfin's ffmpeg to allow the stream:

-allowed_extensions ALL -allowed_segment_extensions ALL -extension_picky disabled

@jamesremuscat commented on GitHub (Dec 4, 2025): Just tested further and all three of the following options are required for Jellyfin's ffmpeg to allow the stream: `-allowed_extensions ALL -allowed_segment_extensions ALL -extension_picky disabled`
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/jellyfin#7661