2025-10-24, 03:59 PM
(This post was last modified: 2025-10-24, 05:59 PM by Pleune. Edited 4 times in total.)
Here is the ffmpeg command that emby uses:
/opt/emby-server/bin/ffmpeg -loglevel +timing -y -print_graphs_file "/var/lib/emby/logs/ffmpeg-transcode-141b2ab2-0954-401a-b99a-8d3b72819789_1graph.txt" -copyts -start_at_zero -init_hw_device "vaapi=dev1:/dev/dri/renderD128" -analyzeduration 3000000 -f mpegts -c:v:0 mpeg2video -threads:v:0 1 -hwaccel:v:0 vaapi -hwaccel_device:v:0 dev1 -hwaccel_output_format:v:0 vaapi -noautorotate -i "http://127.0.0.1:8096/LiveTv/LiveStreamFiles/1c75b24e6ef5423b889480942ecf3228/stream.ts" -map 0:0 -map 0:1 -sn -c:v:0 h264_vaapi -b:v:0 5678698 -g:v:0 180 -maxrate:v:0 5678698 -bufsize:v:0 11357396 -keyint_min:v:0 180 -r:v:0 59.940059661865234 -profile:v:0 high -c:a:0 libmp3lame -ab:a:0 192000 -ac:a:0 2 -metadata:s:a:0 language=eng -filter:a:0 "volume=2" -disposition:a:0 default -fflags +discardcorruptts+fillwallclockdts -max_delay 5000000 -avoid_negative_ts disabled -f segment -map_metadata -1 -map_chapters -1 -segment_format mpegts -segment_list "/var/lib/emby/transcoding-temp/9FDFDF/9FDFDF.m3u8" -segment_list_type m3u8 -segment_time 00:00:03.000 -segment_list_entry_prefix hls/9FDFDF/ -segment_start_number 0 -individual_header_trailer 0 -write_header_trailer 0 -segment_write_temp 1 "/var/lib/emby/transcoding-temp/9FDFDF/9FDFDF_%d.ts"
compared to jellyfin:
/nix/store/9qy1ff65bybyap8y39v6jk5gj97i407p-jellyfin-ffmpeg-7.1.2-2-bin/bin/ffmpeg -analyzeduration 3000000 -probesize 1G -fflags +igndts+discardcorrupt -i "https://192.168.10.164:8920/LiveTv/LiveStreamFiles/5557bd830ebe4928b41cecaef8798423/stream.ts" -map_metadata -1 -map_chapters -1 -threads 0 -sn -codec:v:0 libx264 -preset ultrafast -crf 23 -maxrate 8000000 -bufsize 16000000 -profile:v:0 high -level 51 -x264opts:0 subme=0:me_range=16:rc_lookahead=10:me=hex:open_gop=0 -force_key_frames:0 "expr:gte(t,n_forced*3)" -sc_threshold:v:0 0 -vf "setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,scale=trunc(min(max(iw\,ih*a)\,min(1280\,720*a))/2)*2:trunc(min(max(iw/a\,ih)\,min(1280/a\,720))/2)*2,format=yuv420p" -flags -global_header -codec:a:0 aac -ac 2 -ab 256000 -af "volume=2" -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 0 -hls_base_url "hls/6ac185d824c6774fa01b64af06ba7e62/" -hls_segment_filename "/var/cache/jellyfin/transcodes/6ac185d824c6774fa01b64af06ba7e62%d.ts" -hls_playlist_type event -hls_list_size 0 -y "/var/cache/jellyfin/transcodes/6ac185d824c6774fa01b64af06ba7e62.m3u8"
I have tried also adding the discardcorruptts and fillwallclockdts options, but these don't seem to exist with jellyfin-ffmpeg
I have also tried adding a lot of error handling flags to ffmpeg, which results in this:
with +discardcorrupt+genpts -err_detect ignore_err -avoid_negative_ts disabled -timeout 5000000 -rw_timeout 5000000 -reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 2:
frame= 8305 fps= 61 q=30.0 size=N/A time=00:02:15.93 bitrate=N/A speed=0.995x
frame= 8332 fps= 61 q=29.0 size=N/A time=00:02:16.51 bitrate=N/A speed=0.996x
frame= 8361 fps= 61 q=27.0 size=N/A time=00:02:16.89 bitrate=N/A speed=0.995x
frame= 8394 fps= 61 q=24.0 size=N/A time=00:02:17.47 bitrate=N/A speed=0.996x
frame= 8425 fps= 61 q=25.0 size=N/A time=00:02:18.04 bitrate=N/A speed=0.996x
frame= 8458 fps= 61 q=24.0 size=N/A time=00:02:18.43 bitrate=N/A speed=0.996x
frame= 8464 fps= 61 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.993x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.99x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.986x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.983x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.979x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.976x
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.972x
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.969x
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.966x
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.962x
[tls @ 0x5607ee1eba40] Error in the pull function.
[tls @ 0x5607ee1eba40] IO error: Connection timed out
[https @ 0x5607ee1ed480] Will reconnect at 129212284 in 0 second(s), error=Connection timed out.
[https @ 0x5607ee1ed480] HTTP error 404 Not Found
[tls @ 0x5607ee1eba40] The specified session has been invalidated for some reason.
[https @ 0x5607ee1ed480] Will reconnect at 129212284 in 1 second(s), error=Input/output error.
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.959x
frame= 8464 fps= 58 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.956x
[https @ 0x5607ee1ed480] HTTP error 404 Not Found
[tls @ 0x5607ee1eba40] The specified session has been invalidated for some reason.
[mpegts @ 0x5607ee1ec2c0] PES packet size mismatch
[mpegts @ 0x5607ee1ec2c0] Packet corrupt (stream = 1, dts = 7230213609), dropping it.
[in#0/mpegts @ 0x5607ee1aef40] Error during demuxing: Input/output error
[mpeg2video @ 0x5607f03a1f40] ac-tex damaged at 19 21
[mpeg2video @ 0x5607f03a1f40] Warning MVs not available
[mpeg2video @ 0x5607f03a1f40] concealing 1920 DC, 1920 AC, 1920 MV errors in P frame
[vist#0:0/mpeg2video @ 0x5607ef4e8200] [dec:mpeg2video @ 0x5607ee35ab40] corrupt decoded frame
[hls @ 0x5607eea21e80] Opening '/var/cache/jellyfin/transcodes/465ffa4d14ff24de02d662ab8857dd4c46.ts' for writing
[hls @ 0x5607eea21e80] Opening '/var/cache/jellyfin/transcodes/465ffa4d14ff24de02d662ab8857dd4c.m3u8.tmp' for writing
[hls @ 0x5607eea21e80] Opening '/var/cache/jellyfin/transcodes/465ffa4d14ff24de02d662ab8857dd4c47.ts' for writing
[hls @ 0x5607eea21e80] Opening '/var/cache/jellyfin/transcodes/465ffa4d14ff24de02d662ab8857dd4c.m3u8.tmp' for writing
[out#0/hls @ 0x5607f0076f40] video:109408KiB audio:4607KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
frame= 8489 fps= 58 q=-1.0 Lsize=N/A time=00:02:18.70 bitrate=N/A dup=2 drop=0 speed=0.954x
[libx264 @ 0x5607ee9ff680] frame I:48 Avg QP:22.35 size: 88961
[libx264 @ 0x5607ee9ff680] frame P:8441 Avg QP:24.90 size: 12767
[libx264 @ 0x5607ee9ff680] mb I I16..4: 100.0% 0.0% 0.0%
[libx264 @ 0x5607ee9ff680] mb P I16..4: 5.3% 0.0% 0.0% P16..4: 35.9% 0.0% 0.0% 0.0% 0.0% skip:58.9%
[libx264 @ 0x5607ee9ff680] coded y,uvDC,uvAC intra: 30.5% 44.1% 14.0% inter: 15.2% 13.1% 1.2%
[libx264 @ 0x5607ee9ff680] i16 v,h,dc,p: 41% 28% 15% 17%
[libx264 @ 0x5607ee9ff680] i8c dc,h,v,p: 42% 25% 24% 9%
[libx264 @ 0x5607ee9ff680] kb/s:6328.46
[aac @ 0x5607f04c8080] Qavg: 867.942
I think this shows the the HDHR is loosing the signal for so long that it closes the stream. So I think the only way to work around this in jellyfin would be to add some proper re-connection logic that know when video is lost and does a full reload.
/opt/emby-server/bin/ffmpeg -loglevel +timing -y -print_graphs_file "/var/lib/emby/logs/ffmpeg-transcode-141b2ab2-0954-401a-b99a-8d3b72819789_1graph.txt" -copyts -start_at_zero -init_hw_device "vaapi=dev1:/dev/dri/renderD128" -analyzeduration 3000000 -f mpegts -c:v:0 mpeg2video -threads:v:0 1 -hwaccel:v:0 vaapi -hwaccel_device:v:0 dev1 -hwaccel_output_format:v:0 vaapi -noautorotate -i "http://127.0.0.1:8096/LiveTv/LiveStreamFiles/1c75b24e6ef5423b889480942ecf3228/stream.ts" -map 0:0 -map 0:1 -sn -c:v:0 h264_vaapi -b:v:0 5678698 -g:v:0 180 -maxrate:v:0 5678698 -bufsize:v:0 11357396 -keyint_min:v:0 180 -r:v:0 59.940059661865234 -profile:v:0 high -c:a:0 libmp3lame -ab:a:0 192000 -ac:a:0 2 -metadata:s:a:0 language=eng -filter:a:0 "volume=2" -disposition:a:0 default -fflags +discardcorruptts+fillwallclockdts -max_delay 5000000 -avoid_negative_ts disabled -f segment -map_metadata -1 -map_chapters -1 -segment_format mpegts -segment_list "/var/lib/emby/transcoding-temp/9FDFDF/9FDFDF.m3u8" -segment_list_type m3u8 -segment_time 00:00:03.000 -segment_list_entry_prefix hls/9FDFDF/ -segment_start_number 0 -individual_header_trailer 0 -write_header_trailer 0 -segment_write_temp 1 "/var/lib/emby/transcoding-temp/9FDFDF/9FDFDF_%d.ts"
compared to jellyfin:
/nix/store/9qy1ff65bybyap8y39v6jk5gj97i407p-jellyfin-ffmpeg-7.1.2-2-bin/bin/ffmpeg -analyzeduration 3000000 -probesize 1G -fflags +igndts+discardcorrupt -i "https://192.168.10.164:8920/LiveTv/LiveStreamFiles/5557bd830ebe4928b41cecaef8798423/stream.ts" -map_metadata -1 -map_chapters -1 -threads 0 -sn -codec:v:0 libx264 -preset ultrafast -crf 23 -maxrate 8000000 -bufsize 16000000 -profile:v:0 high -level 51 -x264opts:0 subme=0:me_range=16:rc_lookahead=10:me=hex:open_gop=0 -force_key_frames:0 "expr:gte(t,n_forced*3)" -sc_threshold:v:0 0 -vf "setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,scale=trunc(min(max(iw\,ih*a)\,min(1280\,720*a))/2)*2:trunc(min(max(iw/a\,ih)\,min(1280/a\,720))/2)*2,format=yuv420p" -flags -global_header -codec:a:0 aac -ac 2 -ab 256000 -af "volume=2" -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 0 -hls_base_url "hls/6ac185d824c6774fa01b64af06ba7e62/" -hls_segment_filename "/var/cache/jellyfin/transcodes/6ac185d824c6774fa01b64af06ba7e62%d.ts" -hls_playlist_type event -hls_list_size 0 -y "/var/cache/jellyfin/transcodes/6ac185d824c6774fa01b64af06ba7e62.m3u8"
I have tried also adding the discardcorruptts and fillwallclockdts options, but these don't seem to exist with jellyfin-ffmpeg
I have also tried adding a lot of error handling flags to ffmpeg, which results in this:
with +discardcorrupt+genpts -err_detect ignore_err -avoid_negative_ts disabled -timeout 5000000 -rw_timeout 5000000 -reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 2:
frame= 8305 fps= 61 q=30.0 size=N/A time=00:02:15.93 bitrate=N/A speed=0.995x
frame= 8332 fps= 61 q=29.0 size=N/A time=00:02:16.51 bitrate=N/A speed=0.996x
frame= 8361 fps= 61 q=27.0 size=N/A time=00:02:16.89 bitrate=N/A speed=0.995x
frame= 8394 fps= 61 q=24.0 size=N/A time=00:02:17.47 bitrate=N/A speed=0.996x
frame= 8425 fps= 61 q=25.0 size=N/A time=00:02:18.04 bitrate=N/A speed=0.996x
frame= 8458 fps= 61 q=24.0 size=N/A time=00:02:18.43 bitrate=N/A speed=0.996x
frame= 8464 fps= 61 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.993x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.99x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.986x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.983x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.979x
frame= 8464 fps= 60 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.976x
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.972x
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.969x
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.966x
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.962x
[tls @ 0x5607ee1eba40] Error in the pull function.
[tls @ 0x5607ee1eba40] IO error: Connection timed out
[https @ 0x5607ee1ed480] Will reconnect at 129212284 in 0 second(s), error=Connection timed out.
[https @ 0x5607ee1ed480] HTTP error 404 Not Found
[tls @ 0x5607ee1eba40] The specified session has been invalidated for some reason.
[https @ 0x5607ee1ed480] Will reconnect at 129212284 in 1 second(s), error=Input/output error.
frame= 8464 fps= 59 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.959x
frame= 8464 fps= 58 q=24.0 size=N/A time=00:02:18.62 bitrate=N/A speed=0.956x
[https @ 0x5607ee1ed480] HTTP error 404 Not Found
[tls @ 0x5607ee1eba40] The specified session has been invalidated for some reason.
[mpegts @ 0x5607ee1ec2c0] PES packet size mismatch
[mpegts @ 0x5607ee1ec2c0] Packet corrupt (stream = 1, dts = 7230213609), dropping it.
[in#0/mpegts @ 0x5607ee1aef40] Error during demuxing: Input/output error
[mpeg2video @ 0x5607f03a1f40] ac-tex damaged at 19 21
[mpeg2video @ 0x5607f03a1f40] Warning MVs not available
[mpeg2video @ 0x5607f03a1f40] concealing 1920 DC, 1920 AC, 1920 MV errors in P frame
[vist#0:0/mpeg2video @ 0x5607ef4e8200] [dec:mpeg2video @ 0x5607ee35ab40] corrupt decoded frame
[hls @ 0x5607eea21e80] Opening '/var/cache/jellyfin/transcodes/465ffa4d14ff24de02d662ab8857dd4c46.ts' for writing
[hls @ 0x5607eea21e80] Opening '/var/cache/jellyfin/transcodes/465ffa4d14ff24de02d662ab8857dd4c.m3u8.tmp' for writing
[hls @ 0x5607eea21e80] Opening '/var/cache/jellyfin/transcodes/465ffa4d14ff24de02d662ab8857dd4c47.ts' for writing
[hls @ 0x5607eea21e80] Opening '/var/cache/jellyfin/transcodes/465ffa4d14ff24de02d662ab8857dd4c.m3u8.tmp' for writing
[out#0/hls @ 0x5607f0076f40] video:109408KiB audio:4607KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
frame= 8489 fps= 58 q=-1.0 Lsize=N/A time=00:02:18.70 bitrate=N/A dup=2 drop=0 speed=0.954x
[libx264 @ 0x5607ee9ff680] frame I:48 Avg QP:22.35 size: 88961
[libx264 @ 0x5607ee9ff680] frame P:8441 Avg QP:24.90 size: 12767
[libx264 @ 0x5607ee9ff680] mb I I16..4: 100.0% 0.0% 0.0%
[libx264 @ 0x5607ee9ff680] mb P I16..4: 5.3% 0.0% 0.0% P16..4: 35.9% 0.0% 0.0% 0.0% 0.0% skip:58.9%
[libx264 @ 0x5607ee9ff680] coded y,uvDC,uvAC intra: 30.5% 44.1% 14.0% inter: 15.2% 13.1% 1.2%
[libx264 @ 0x5607ee9ff680] i16 v,h,dc,p: 41% 28% 15% 17%
[libx264 @ 0x5607ee9ff680] i8c dc,h,v,p: 42% 25% 24% 9%
[libx264 @ 0x5607ee9ff680] kb/s:6328.46
[aac @ 0x5607f04c8080] Qavg: 867.942
I think this shows the the HDHR is loosing the signal for so long that it closes the stream. So I think the only way to work around this in jellyfin would be to add some proper re-connection logic that know when video is lost and does a full reload.

