jellyfin / jellyfin-roku

The Official Roku Client for Jellyfin
https://jellyfin.org
GNU General Public License v2.0
412 stars 128 forks source link

4K HDR fails to play on Roku TV through Jellyfin (but raw file plays on Roku TV) #1308

Open jongames opened 1 year ago

jongames commented 1 year ago

Software Versions

Describe the bug

Most of my 4K HDR video files fail to play on my roku tv through the jellyfin roku app. (they worked before on Emby but I don't remember if they ever worked on Jellyfin) Putting the same file on an external USB HDD and plugging it into the Roku TV works perfectly fine. If I force transcoding of the 4K HDR by lowing the bitrate limit, it then will play on the roku tv. My internet connection can handle the bitrate so that is not the issue, there is some issue with how the jellyfin client is telling the roku to play the file or maybe how the jellyfin client is asking the server to request the file and it is giving a wrong format.

The issue seems to be related to HDR because if I downgrade the HDR to SDR (for some reason adding subtitles disables HDR and forces it to transcode), then it plays in 4K SDR just fine.

Logs

I do not know how to get error logs for the roku app. The server logs / ffmpeg logs do not show any errors but snippets are pasted below:

HDR w/ transcoding audio (fails)

Stream #0:0(eng): Video: hevc (Main 10), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 3840x2160 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn (default) Metadata: BPS-eng : 69272915 DURATION-eng : 01:50:44.221000000 NUMBER_OF_FRAMES-eng: 159302 NUMBER_OF_BYTES-eng: 57533070088 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:1(eng): Audio: truehd, 48000 Hz, 7.1, s32 (24 bit) (default) Metadata: BPS-eng : 4000235 DURATION-eng : 01:50:44.221000000 NUMBER_OF_FRAMES-eng: 7973065 NUMBER_OF_BYTES-eng: 3322305954 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:2(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s Metadata: BPS-eng : 448000 DURATION-eng : 01:50:44.224000000 NUMBER_OF_FRAMES-eng: 207632 NUMBER_OF_BYTES-eng: 372076544 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:3(eng): Subtitle: hdmv_pgs_subtitle (default) Metadata: BPS-eng : 44975 DURATION-eng : 01:40:08.795000000 NUMBER_OF_FRAMES-eng: 3200 NUMBER_OF_BYTES-eng: 33780869 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (truehd (native) -> aac (libfdk_aac)) Press [q] to stop, [?] for help Output #0, hls, to '/var/lib/jellyfin/transcodes/6b57c153c1ee33b44637d7658.m3u8': Metadata: encoder : Lavf60.3.100 Stream #0:0(eng): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 23.98 fps, 23.98 tbr, 90k tbn (default) Metadata: BPS-eng : 69272915 DURATION-eng : 01:50:44.221000000 NUMBER_OF_FRAMES-eng: 159302 NUMBER_OF_BYTES-eng: 57533070088 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:1(eng): Audio: aac, 48000 Hz, 5.1, s16, 640 kb/s (default) Metadata: BPS-eng : 4000235 DURATION-eng : 01:50:44.221000000 NUMBER_OF_FRAMES-eng: 7973065 NUMBER_OF_BYTES-eng: 3322305954 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES encoder : Lavc60.3.100 libfdk_aac frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x
[hls @ 0x55daadfe6f00] Opening '/var/lib/jellyfin/transcodes/6b57c153c1ee36581.ts' for writing [hls @ 0x55daadfe6f00] Opening '/var/lib/jellyfin/transcodes/6b57c153c1ee3f44637d76582.ts' for writing frame= 346 fps=0.0 q=-1.0 size=N/A time=00:00:14.37 bitrate=N/A speed=28.7x

The same video as before but HDR to SDR due to subtitles (video plays without issue other than lacking HDR...)

Stream #0:0(eng): Video: hevc (Main 10), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 3840x2160 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn (default) Metadata: BPS-eng : 69272915 DURATION-eng : 01:50:44.221000000 NUMBER_OF_FRAMES-eng: 159302 NUMBER_OF_BYTES-eng: 57533070088 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:1(eng): Audio: truehd, 48000 Hz, 7.1, s32 (24 bit) (default) Metadata: BPS-eng : 4000235 DURATION-eng : 01:50:44.221000000 NUMBER_OF_FRAMES-eng: 7973065 NUMBER_OF_BYTES-eng: 3322305954 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:2(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s Metadata: BPS-eng : 448000 DURATION-eng : 01:50:44.224000000 NUMBER_OF_FRAMES-eng: 207632 NUMBER_OF_BYTES-eng: 372076544 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:3(eng): Subtitle: hdmv_pgs_subtitle (default) Metadata: BPS-eng : 44975 DURATION-eng : 01:40:08.795000000 NUMBER_OF_FRAMES-eng: 3200 NUMBER_OF_BYTES-eng: 33780869 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream mapping: Stream #0:0 (hevc_qsv) -> setparams:default (graph 0) Stream #0:3 (pgssub) -> scale:default (graph 0) overlay_qsv:default (graph 0) -> Stream #0:0 (hevc_qsv) Stream #0:1 -> #0:1 (truehd (native) -> aac (libfdk_aac)) Press [q] to stop, [?] for help [matroska,webm @ 0x55a1f2d61f40] sub2video: using 3840x2160 canvas Output #0, hls, to '/var/lib/jellyfin/transcodes/f404e935b68f2d6cfc21d4a8f0dc89cb.m3u8': Metadata: encoder : Lavf60.3.100 Stream #0:0: Video: hevc (hvc1 / 0x31637668), qsv(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 73803 kb/s, 23.98 fps, 90k tbn Metadata: encoder : Lavc60.3.100 hevc_qsv Side data: cpb: bitrate max/min/avg: 73803784/0/73803784 buffer size: 147607568 vbv_delay: N/A Stream #0:1(eng): Audio: aac, 48000 Hz, 5.1, s16, 640 kb/s (default) Metadata: BPS-eng : 4000235 DURATION-eng : 01:50:44.221000000 NUMBER_OF_FRAMES-eng: 7973065 NUMBER_OF_BYTES-eng: 3322305954 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-08-04 20:26:06 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES encoder : Lavc60.3.100 libfdk_aac frame= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed= 0x
frame= 34 fps=0.0 q=-0.0 size=N/A time=00:00:01.64 bitrate=N/A speed=2.04x
[hls @ 0x55a1f2f37580] Opening '/var/lib/jellyfin/transcodes/f404e935b68f2d6cfc21d4a8f0dc89cb0.ts' for writing frame= 73 fps= 56 q=-0.0 size=N/A time=00:00:03.30 bitrate=N/A speed=2.53x
frame= 103 fps= 57 q=-0.0 size=N/A time=00:00:04.54 bitrate=N/A speed=2.51x
[hls @ 0x55a1f2f37580] Opening '/var/lib/jellyfin/transcodes/f404e935b68f2d6cfc21d4a8f0dc89cb1.ts' for writing frame= 145 fps= 63 q=-0.0 size=N/A time=00:00:06.29 bitrate=N/A speed=2.72x
frame= 190 fps= 67 q=-0.0 size=N/A time=00:00:08.17 bitrate=N/A speed= 2.9x
[hls @ 0x55a1f2f37580] Opening '/var/lib/jellyfin/transcodes/f404e935b68f2d6cfc21d4a8f0dc89cb2.ts' for writing frame= 233 fps= 70 q=-0.0 size=N/A time=00:00:09.94 bitrate=N/A speed=2.99x
frame= 276 fps= 72 q=-0.0 size=N/A time=00:00:11.81 bitrate=N/A speed=3.08x
[hls @ 0x55a1f2f37580] Opening '/var/lib/jellyfin/transcodes/f404e935b68f2d6cfc21d4a8f0dc89cb3.ts' for writing frame= 319 fps= 74 q=-0.0 size=N/A time=00:00:13.52 bitrate=N/A speed=3.12x


A different file with AC3 audio that is supported by my roku tv: HDR DirectPlay with no transcoding (works)

[2023-06-14 23:44:53.482 -04:00] [INF] User policy for "SERVER". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True [2023-06-14 23:44:53.483 -04:00] [INF] StreamBuilder.BuildVideoItem( Profile="Anonymous Profile", Path="/media/movies/(2018) - 4K HDR.mkv", AudioStreamIndex=2, SubtitleStreamIndex=-1 ) => ( PlayMethod=DirectPlay, TranscodeReason=0 ) "media:/videos/c0ec0949-52eb-175e057bf978/stream.mkv?MediaSourceId=c0ec09494796f175e057bf978&Static=true&VideoCodec=hevc&AudioCodec=ac3&AudioStreamIndex=2&api_key=&SubtitleMethod=Encode&Tag=fbb0e75a4a6ef9fc9dc2a9"

Connection Information

jongames commented 1 year ago

Now, another issue which may be related: setting a bitrate limit on the roku client leads to the 4K HDR file being converted to 4K SDR for no reason (but the file does play successfully). It should remain in HDR.

> [2023-06-15 00:00:37.461 -04:00] [INF] User policy for "". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
> [2023-06-15 00:00:37.461 -04:00] [INF] StreamBuilder.BuildVideoItem( Profile="Anonymous Profile", Path="/media/movies/(2018) - 4K HDR.mkv", AudioStreamIndex=1, SubtitleStreamIndex=-1 ) => ( PlayMethod=Transcode, TranscodeReason=AudioCodecNotSupported, VideoBitrateNotSupported ) "media:/videos/350fe1db-cc23ceb4cb5b/master.m3u8?MediaSourceId=5f9854be675e1f29&VideoCodec=hevc,h264,hevc&AudioCodec=aac,ac3&AudioStreamIndex=1&VideoBitrate=30000000&AudioBitrate=640000&MaxFramerate=23.976025&api_key=<token>&SubtitleMethod=Encode&TranscodingMaxAudioChannels=6&RequireAvc=false&Tag=07238fc4aa&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=True&hevc-level=153&hevc-videobitdepth=10&hevc-profile=main10&hevc-rangetype=SDR,HDR10,HLG,DOVI&TranscodeReasons=AudioCodecNotSupported,%20VideoBitrateNotSupported"
> [2023-06-15 00:00:38.560 -04:00] [INF] Current HLS implementation doesn't support non-keyframe breaks but one is requested, ignoring that request
> [2023-06-15 00:00:38.560 -04:00] [INF] "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-analyzeduration 200M -ss 00:00:09.000 -init_hw_device vaapi=va:,driver=iHD,kernel_driver=i915 -init_hw_device qsv=qs@va -init_hw_device opencl=ocl@va -filter_hw_device qs -hwaccel qsv -hwaccel_output_format qsv -c:v hevc_qsv -autorotate 0 -i file:\"/media/movies/(2018) - 4K HDR.mkv\" -autoscale 0 -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 hevc_qsv -tag:v:0 hvc1 -low_power 1 -preset 7 -b:v 30000000 -maxrate 30000000 -bufsize 60000000 -profile:v:0 main -level 50 -g:v:0 72 -keyint_min:v:0 72 -vf \"setparams=color_primaries=bt2020:color_trc=smpte2084:colorspace=bt2020nc,scale_qsv=w=2560:h=1440,hwmap=derive_device=opencl,tonemap_opencl=format=nv12:p=bt709:t=bt709:m=bt709:tonemap=bt2390:peak=100:desat=0,hwmap=derive_device=qsv:reverse=1:extra_hw_frames=16,format=qsv\" -codec:a:0 libfdk_aac -ac 6 -ab 640000 -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 3 -hls_segment_filename \"/var/lib/jellyfin/transcodes/367e50bb74%d.ts\" -hls_playlist_type vod -hls_list_size 0 -y \"/var/lib/jellyfin/transcodes/367ebb74.m3u8\""
tomsykes commented 3 months ago

Suspect I'm having a similar issue. I've disabled transcoding for the moment (for various reasons), but I have several videos that play through the roku media player app, but not on jellyfin - all of them have encodings that fall slightly outside of the strict compatibility list here

Errors like this...

[2024-03-15 08:52:32.411 +00:00] [INF] StreamBuilder.BuildVideoItem( Profile="Official Roku Client", Path="\\media.lan\Videos\test.mp4", AudioStreamIndex=1, SubtitleStreamIndex=-2 ) => ( PlayMethod=Transcode, TranscodeReason=VideoProfileNotSupported ) "media:/videos/4c318053-b6de-3e37-2397-ed8ed3e3e51d/stream?MediaSourceId=4c318053b6de3e372397ed8ed3e3e51d&AudioStreamIndex=1&SubtitleStreamIndex=-2&api_key=<token>&SubtitleMethod=Encode&RequireAvc=false&Tag=7d13fc5db512c26e7de84248a0221aa7&TranscodeReasons=VideoProfileNotSupported"

To clarify, I suspect the device is capable of playing the files, but because the docs say it's not, jellyfin isn't even trying.


This one uses Constrained Baseline (expected to be main or high)

  Stream #0:0[0x1](und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x960 [SAR 1:1 DAR 2:1], 2588 kb/s, 23.98 fps, 23.98 tbr, 90k tbn (default)

This one isn't using bt.709 colorspace and level 4.0 (not sure which is the reason for not playing)

  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1794x1080 [SAR 1:1 DAR 299:180], 1636 kb/s, 23.96 fps, 23.98 tbr, 90k tbn (default)
The-Math-God commented 1 month ago

any updates to this

jongames commented 1 month ago

any updates to this

The issue is still present. There has been improvement though, before it would not even try to play but now it starts playing and still crashes out of the app. This is on version 2.0 build 7 of the Roku Jellyfin app.

It starts trying to play the 4K HDR MKV and then crashes after a bit maybe 10-15 seconds. If you use a bitrate limit then it plays fine but it downgrades the quality to SDR for some reason which defeats the point of trying to play HDR...