2025-06-22, 02:19 AM
So from what I can see in the log, Jellyfin receives the request to play the item and 500 ms later, it complies with that request.
Debug logging is, most of the time, unhelpful because it injects a lot of crap where there's likely not an error. It'll just create massive logs for you to deal with. I'm also very confused by the fact that the AndroidTV-ExoPlayer profile says it supports E-AC3 and yet your audio is being transcoded.
Looking at the ffmpeg log, it supports this claim:
On that note, the AAC 2.0 tag is incorrect based on what's going on here (but that's beside the point).
I don't see any delay between when Jellyfin receives the request and when it plays the media, but I guess I could be misreading? What happens if you swap the player in the ATV app? Any difference in responsiveness?
Code:
[2025-06-22 01:36:00.821 +02:00] [DBG] [9] Jellyfin.Api.Controllers.MediaInfoController: GetPostedPlaybackInfo profile: DeviceProfile { Name: "AndroidTV-ExoPlayer", Id: null, MaxStreamingBitrate: 20000000, MaxStaticBitrate: 100000000, MusicStreamingTranscodingBitrate: 128000, MaxStaticMusicBitrate: 8000000, DirectPlayProfiles: [DirectPlayProfile { Container: "m4v,mov,xvid,vob,mkv,wmv,asf,ogm,ogv,mp4,webm,ts,hls", AudioCodec: "aac,mp3,mp2", VideoCodec: "h264,hevc,vp8,vp9,mpeg,mpeg2video,av1", Type: Video }, DirectPlayProfile { Container: "aac,mp3,mp2,aac_latm,alac,ac3,eac3,dca,dts,mlp,truehd,pcm_alaw,pcm_mulaw,pcm_s16le,pcm_s20le,pcm_s24le,opus,flac,vorbis,mpa,wav,wma,ogg,oga,webma,ape", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "jpg,jpeg,png,gif,webp", AudioCodec: null, VideoCodec: null, Type: Photo }], TranscodingProfiles: [TranscodingProfile { Container: "ts", Type: Video, VideoCodec: "hevc,h264", AudioCodec: "aac,mp3,mp2", Protocol: hls, EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: True, MaxAudioChannels: null, MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [], EnableAudioVbrEncoding: True }, TranscodingProfile { Container: "mp3", Type: Audio, VideoCodec: "", AudioCodec: "mp3", Protocol: http, EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: null, MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [], EnableAudioVbrEncoding: True }], ContainerProfiles: [], CodecProfiles: [CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: EqualsAny, Property: VideoProfile, Value: "high|main|baseline|constrained baseline", IsRequired: False }], ApplyConditions: [], Codec: "h264", Container: null, SubContainer: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: LessThanEqual, Property: VideoLevel, Value: "52", IsRequired: False }], ApplyConditions: [ProfileCondition { Condition: EqualsAny, Property: VideoProfile, Value: "high|main|baseline|constrained baseline", IsRequired: False }], Codec: "h264", Container: null, SubContainer: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: LessThanEqual, Property: RefFrames, Value: "12", IsRequired: False }], ApplyConditions: [ProfileCondition { Condition: GreaterThanEqual, Property: Width, Value: "1200", IsRequired: False }], Codec: "h264", Container: null, SubContainer: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: LessThanEqual, Property: RefFrames, Value: "4", IsRequired: False }], ApplyConditions: [ProfileCondition { Condition: GreaterThanEqual, Property: Width, Value: "1900", IsRequired: False }], Codec: "h264", Container: null, SubContainer: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: EqualsAny, Property: VideoProfile, Value: "main|main 10", IsRequired: False }], ApplyConditions: [], Codec: "hevc", Container: null, SubContainer: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: LessThanEqual, Property: VideoLevel, Value: "153", IsRequired: False }], ApplyConditions: [ProfileCondition { Condition: Equals, Property: VideoProfile, Value: "main", IsRequired: False }], Codec: "hevc", Container: null, SubContainer: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: LessThanEqual, Property: VideoLevel, Value: "153", IsRequired: False }], ApplyConditions: [ProfileCondition { Condition: Equals, Property: VideoProfile, Value: "main 10", IsRequired: False }], Codec: "hevc", Container: null, SubContainer: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: Equals, Property: VideoProfile, Value: "none", IsRequired: False }], ApplyConditions: [], Codec: "av1", Container: null, SubContainer: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: LessThanEqual, Property: Width, Value: "4096", IsRequired: False }, ProfileCondition { Condition: LessThanEqual, Property: Height, Value: "2304", IsRequired: False }], ApplyConditions: [], Codec: null, Container: null, SubContainer: null }, CodecProfile { Type: VideoAudio, Conditions: [ProfileCondition { Condition: LessThanEqual, Property: AudioChannels, Value: "2", IsRequired: False }], ApplyConditions: [], Codec: null, Container: null, SubContainer: null }], SubtitleProfiles: [SubtitleProfile { Format: "vtt", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "vtt", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "vtt", Method: Hls, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "webvtt", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "webvtt", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "webvtt", Method: Hls, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "srt", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "srt", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "subrip", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "subrip", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ttml", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ttml", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "dvbsub", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "dvbsub", Method: Encode, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "idx", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "idx", Method: Encode, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "pgs", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "pgs", Method: Encode, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "pgssub", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "pgssub", Method: Encode, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ass", Method: Encode, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ssa", Method: Encode, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "dvdsub", Method: Encode, DidlMode: null, Language: null, Container: null }] }
[2025-06-22 01:36:00.821 +02:00] [DBG] [9] MediaBrowser.Controller.Entities.BaseItem: "tv" has no parental rating set.
[2025-06-22 01:36:00.821 +02:00] [DBG] [9] MediaBrowser.Controller.Entities.BaseItem: "root" has no parental rating set.
[2025-06-22 01:36:00.822 +02:00] [DBG] [9] MediaBrowser.Controller.Entities.BaseItem: "Videos" has no parental rating set.
[2025-06-22 01:36:00.822 +02:00] [DBG] [9] MediaBrowser.Controller.Entities.BaseItem: "Anime" has no parental rating set.
[2025-06-22 01:36:00.822 +02:00] [DBG] [9] MediaBrowser.Controller.Entities.BaseItem: "Serien" has no parental rating set.
[2025-06-22 01:36:00.822 +02:00] [DBG] [9] MediaBrowser.Controller.Entities.BaseItem: "Filme" has no parental rating set.
[2025-06-22 01:36:00.822 +02:00] [DBG] [9] MediaBrowser.Controller.Entities.BaseItem: "Playlists" has no parental rating set.
[2025-06-22 01:36:00.849 +02:00] [INF] [9] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "xxxx". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[2025-06-22 01:36:00.853 +02:00] [DBG] [9] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: "AndroidTV-ExoPlayer", Path: "/data/media/tv/Bob's Burgers (2011)/Season 03/Bob's Burgers (2011) - S03E10 - Mother Daughter Laser Razor [German DL WEBDL-720p][AAC 2.0][h264]-TSCC.mkv", isEligibleForDirectPlay: True, isEligibleForDirectStream: False
[2025-06-22 01:36:00.858 +02:00] [DBG] [9] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: "VideoAudioCodecProfile", DirectPlay=false. Reason="AndroidTV-ExoPlayer".AudioChannels Condition: LessThanEqual. ConditionValue: "2". IsRequired: False. Path: "/data/media/tv/Bob's Burgers (2011)/Season 03/Bob's Burgers (2011) - S03E10 - Mother Daughter Laser Razor [German DL WEBDL-720p][AAC 2.0][h264]-TSCC.mkv"
[2025-06-22 01:36:00.866 +02:00] [DBG] [9] Jellyfin.Api.Helpers.MediaInfoHelper: DirectPlay Result for Profile: "AndroidTV-ExoPlayer", Path: "/data/media/tv/Bob's Burgers (2011)/Season 03/Bob's Burgers (2011) - S03E10 - Mother Daughter Laser Razor [German DL WEBDL-720p][AAC 2.0][h264]-TSCC.mkv", PlayMethod: null, AudioStreamIndex: 5, SubtitleStreamIndex: 2, Reasons: AudioCodecNotSupported
[2025-06-22 01:36:00.876 +02:00] [DBG] [9] Jellyfin.Api.Helpers.MediaInfoHelper: Transcode Result for Profile: "AndroidTV-ExoPlayer", Path: "/data/media/tv/Bob's Burgers (2011)/Season 03/Bob's Burgers (2011) - S03E10 - Mother Daughter Laser Razor [German DL WEBDL-720p][AAC 2.0][h264]-TSCC.mkv", PlayMethod: Transcode, AudioStreamIndex: 5, SubtitleStreamIndex: 2, Reasons: AudioCodecNotSupported
[2025-06-22 01:36:00.878 +02:00] [DBG] [9] Jellyfin.Api.Helpers.MediaInfoHelper: StreamBuilder.BuildVideoItem( Profile="AndroidTV-ExoPlayer", Path="/data/media/tv/Bob's Burgers (2011)/Season 03/Bob's Burgers (2011) - S03E10 - Mother Daughter Laser Razor [German DL WEBDL-720p][AAC 2.0][h264]-TSCC.mkv", AudioStreamIndex=null, SubtitleStreamIndex=null ) => ( PlayMethod=Transcode, TranscodeReason=AudioCodecNotSupported ) "media:/videos/92b6cc07-c642-ac74-c949-a93863b023b1/master.m3u8?MediaSourceId=92b6cc07c642ac74c949a93863b023b1&VideoCodec=hevc,h264&AudioCodec=aac,mp3&AudioStreamIndex=5&VideoBitrate=99744000&AudioBitrate=256000&MaxFramerate=23.976025&MaxWidth=4096&MaxHeight=2304&api_key=<token>&EnableSubtitlesInManifest=true&RequireAvc=false&EnableAudioVbrEncoding=true&Tag=e9ff919f4b1f0fe8bf776c48ef51ce2e&SegmentContainer=ts&BreakOnNonKeyFrames=False&h264-level=31&h264-videobitdepth=8&h264-profile=high&hevc-profile=main,main10&h264-maxrefframes=12&aac-audiochannels=2&TranscodeReasons=AudioCodecNotSupported"
Debug logging is, most of the time, unhelpful because it injects a lot of crap where there's likely not an error. It'll just create massive logs for you to deal with. I'm also very confused by the fact that the AndroidTV-ExoPlayer profile says it supports E-AC3 and yet your audio is being transcoded.
Looking at the ffmpeg log, it supports this claim:
Code:
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (eac3 (native) -> aac (libfdk_aac))
On that note, the AAC 2.0 tag is incorrect based on what's going on here (but that's beside the point).
I don't see any delay between when Jellyfin receives the request and when it plays the media, but I guess I could be misreading? What happens if you swap the player in the ATV app? Any difference in responsiveness?
Jellyfin 10.10.7 LSIO Docker | Ubuntu 24.04 LTS | i7-13700K | Arc A380 6 GB | 64 GB RAM | 79 TB Storage