Jellyfin Forum
SOLVED: Transcoding instead of Remuxing - Printable Version

+- Jellyfin Forum (https://forum.jellyfin.org)
+-- Forum: Support (https://forum.jellyfin.org/f-support)
+--- Forum: Troubleshooting (https://forum.jellyfin.org/f-troubleshooting)
+--- Thread: SOLVED: Transcoding instead of Remuxing (/t-solved-transcoding-instead-of-remuxing)



Transcoding instead of Remuxing - jussme - 2023-11-19

  • Version: 10.8.12
  • Installation: linuxserver.io Docker image (10.8.12-1-ls233)
  • Client: Chrome with hardware HEVC main 10 decode and encode support

HEVC main 10 + AAC 5.1 in MKV file is being transcoded instead of remuxed to MP4.

I've confirmed that HEVC main 10 + AAC 5.1 in MP4 is playing directly.

I see a supposed eligibility for direct play in the logs.

The device profile lists:
Code:
DirectPlayProfile { Container: "mp4,m4v", AudioCodec: "aac,mp3,opus,flac,vorbis", VideoCodec: "h264,hevc,vp9,av1", Type: Video }

It seems that all that needs to happen is remuxing to MP4, no? So why is it being transcoded?

Thanks for your time.

The log:

Code:
[2023-11-19 10:48:02.080 +01:00] [DBG] [75] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated.
[2023-11-19 10:48:02.104 +01:00] [DBG] [50] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated.
[2023-11-19 10:48:02.104 +01:00] [DBG] [50] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated.
[2023-11-19 10:48:02.143 +01:00] [DBG] [75] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated.
[2023-11-19 10:48:02.143 +01:00] [DBG] [75] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated.
[2023-11-19 10:48:02.179 +01:00] [DBG] [33] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated.
[2023-11-19 10:48:02.179 +01:00] [DBG] [33] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated.
[2023-11-19 10:48:02.222 +01:00] [DBG] [34] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated.
[2023-11-19 10:48:02.222 +01:00] [DBG] [34] Jellyfin.Api.Auth.CustomAuthenticationHandler: AuthenticationScheme: "CustomAuthentication" was successfully authenticated.
[2023-11-19 10:48:02.226 +01:00] [DBG] [34] Jellyfin.Api.Controllers.MediaInfoController: GetPostedPlaybackInfo profile: DeviceProfile { Name: null, Id: null, Identification: null, FriendlyName: null, Manufacturer: null, ManufacturerUrl: null, ModelName: null, ModelDescription: null, ModelNumber: null, ModelUrl: null, SerialNumber: null, EnableAlbumArtInDidl: False, EnableSingleAlbumArtLimit: False, EnableSingleSubtitleLimit: False, SupportedMediaTypes: "Audio,Photo,Video", UserId: null, AlbumArtPn: null, MaxAlbumArtWidth: null, MaxAlbumArtHeight: null, MaxIconWidth: null, MaxIconHeight: null, MaxStreamingBitrate: 120000000, MaxStaticBitrate: 100000000, MusicStreamingTranscodingBitrate: 384000, MaxStaticMusicBitrate: 8000000, SonyAggregationFlags: null, ProtocolInfo: null, TimelineOffsetSeconds: 0, RequiresPlainVideoItems: False, RequiresPlainFolders: False, EnableMSMediaReceiverRegistrar: False, IgnoreTranscodeByteRangeRequests: False, XmlRootAttributes: [], DirectPlayProfiles: [DirectPlayProfile { Container: "webm", AudioCodec: "vorbis,opus", VideoCodec: "vp8,vp9,av1", Type: Video }, DirectPlayProfile { Container: "mp4,m4v", AudioCodec: "aac,mp3,opus,flac,vorbis", VideoCodec: "h264,hevc,vp9,av1", Type: Video }, DirectPlayProfile { Container: "mov", AudioCodec: "aac,mp3,opus,flac,vorbis", VideoCodec: "h264", Type: Video }, DirectPlayProfile { Container: "opus", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "webm", AudioCodec: "opus", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "mp3", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "aac", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "m4a", AudioCodec: "aac", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "m4b", AudioCodec: "aac", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "flac", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "webma", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "webm", AudioCodec: "webma", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "wav", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "ogg", AudioCodec: null, VideoCodec: null, Type: Audio }], TranscodingProfiles: [TranscodingProfile { Container: "ts", Type: Audio, VideoCodec: "", AudioCodec: "aac", Protocol: "hls", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 1, SegmentLength: 0, BreakOnNonKeyFrames: True, Conditions: [] }, TranscodingProfile { Container: "aac", Type: Audio, VideoCodec: "", AudioCodec: "aac", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }, TranscodingProfile { Container: "mp3", Type: Audio, VideoCodec: "", AudioCodec: "mp3", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }, TranscodingProfile { Container: "opus", Type: Audio, VideoCodec: "", AudioCodec: "opus", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }, TranscodingProfile { Container: "wav", Type: Audio, VideoCodec: "", AudioCodec: "wav", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }, TranscodingProfile { Container: "opus", Type: Audio, VideoCodec: "", AudioCodec: "opus", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Static, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }, TranscodingProfile { Container: "mp3", Type: Audio, VideoCodec: "", AudioCodec: "mp3", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Static, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }, TranscodingProfile { Container: "aac", Type: Audio, VideoCodec: "", AudioCodec: "aac", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Static, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }, TranscodingProfile { Container: "wav", Type: Audio, VideoCodec: "", AudioCodec: "wav", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Static, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }, TranscodingProfile { Container: "ts", Type: Video, VideoCodec: "h264", AudioCodec: "aac,mp3", Protocol: "hls", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 1, SegmentLength: 0, BreakOnNonKeyFrames: True, Conditions: [] }], ContainerProfiles: [], CodecProfiles: [CodecProfile { Type: VideoAudio, Conditions: [ProfileCondition { Condition: Equals, Property: IsSecondaryAudio, Value: "false", IsRequired: False }], ApplyConditions: [], Codec: "aac", Container: null }, CodecProfile { Type: VideoAudio, Conditions: [ProfileCondition { Condition: Equals, Property: IsSecondaryAudio, Value: "false", IsRequired: False }], ApplyConditions: [], Codec: null, Container: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: NotEquals, Property: IsAnamorphic, Value: "true", IsRequired: False }, ProfileCondition { Condition: EqualsAny, Property: VideoProfile, Value: "high|main|baseline|constrained baseline|high 10", IsRequired: False }, ProfileCondition { Condition: EqualsAny, Property: VideoRangeType, Value: "SDR", IsRequired: False }, ProfileCondition { Condition: LessThanEqual, Property: VideoLevel, Value: "52", IsRequired: False }, ProfileCondition { Condition: NotEquals, Property: IsInterlaced, Value: "true", IsRequired: False }], ApplyConditions: [], Codec: "h264", Container: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: NotEquals, Property: IsAnamorphic, Value: "true", IsRequired: False }, ProfileCondition { Condition: EqualsAny, Property: VideoProfile, Value: "main|main 10", IsRequired: False }, ProfileCondition { Condition: EqualsAny, Property: VideoRangeType, Value: "SDR", IsRequired: False }, ProfileCondition { Condition: LessThanEqual, Property: VideoLevel, Value: "183", IsRequired: False }, ProfileCondition { Condition: NotEquals, Property: IsInterlaced, Value: "true", IsRequired: False }], ApplyConditions: [], Codec: "hevc", Container: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: EqualsAny, Property: VideoRangeType, Value: "SDR|HDR10|HLG", IsRequired: False }], ApplyConditions: [], Codec: "vp9", Container: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: EqualsAny, Property: VideoRangeType, Value: "SDR|HDR10|HLG", IsRequired: False }], ApplyConditions: [], Codec: "av1", Container: null }], ResponseProfiles: [ResponseProfile { Container: "m4v", AudioCodec: null, VideoCodec: null, Type: Video, OrgPn: null, MimeType: "video/mp4", Conditions: [] }], SubtitleProfiles: [SubtitleProfile { Format: "vtt", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ass", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ssa", Method: External, DidlMode: null, Language: null, Container: null }] }
[2023-11-19 10:48:02.229 +01:00] [INF] [34] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "admin". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[2023-11-19 10:48:02.229 +01:00] [DBG] [34] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: "Unknown Profile", Path: "/media/series/series_name/S01/ep01.mkv", isEligibleForDirectPlay: True, isEligibleForDirectStream: False
[2023-11-19 10:48:02.230 +01:00] [DBG] [34] Jellyfin.Api.Helpers.MediaInfoHelper: DirectPlay Result for Profile: "Anonymous Profile", Path: "/media/series/series_name/S01/ep01.mkv", PlayMethod: null, AudioStreamIndex: 2, SubtitleStreamIndex: 0, Reasons: VideoCodecNotSupported, AudioCodecNotSupported
[2023-11-19 10:48:02.230 +01:00] [DBG] [34] Jellyfin.Api.Helpers.MediaInfoHelper: Transcode Result for Profile: "Anonymous Profile", Path: "/media/series/series_name/S01/ep01.mkv", PlayMethod: Transcode, AudioStreamIndex: 2, SubtitleStreamIndex: 0, Reasons: VideoCodecNotSupported, AudioCodecNotSupported
[2023-11-19 10:48:02.230 +01:00] [INF] [34] Jellyfin.Api.Helpers.MediaInfoHelper: StreamBuilder.BuildVideoItem( Profile="Anonymous Profile", Path="/media/series/series_name/S01/ep01.mkv", AudioStreamIndex=null, SubtitleStreamIndex=null ) => ( PlayMethod=Transcode, TranscodeReason=VideoCodecNotSupported, AudioCodecNotSupported ) "media:/videos/de3449e7-9700-3d61-138e-ae472477a915/master.m3u8?MediaSourceId=de3449e797003d61138eae472477a915&VideoCodec=h264&AudioCodec=aac&AudioStreamIndex=2&VideoBitrate=139616000&AudioBitrate=384000&AudioSampleRate=48000&MaxFramerate=23.976025&api_key=<token>&TranscodingMaxAudioChannels=2&RequireAvc=false&Tag=cf3fc139c0a69bdb00a3531fea8cc9ba&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=True&hevc-level=120&hevc-videobitdepth=10&hevc-profile=main10&hevc-audiochannels=6&aac-profile=lc&TranscodeReasons=VideoCodecNotSupported,%20AudioCodecNotSupported"



RE: Transcoding instead of Remuxing - tmsrxzar - 2023-11-19

allow me to translate the log you pasted

"User policy for "admin". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True"

means that the user "admin" can use playback remuxing, transcoding and audio transcoding


"DirectPlay Result for Profile: "Anonymous Profile""

but "admin" is not the profile being used, it's using anonymous


"PlayMethod=Transcode, TranscodeReason=VideoCodecNotSupported, AudioCodecNotSupported"

"anonymous" does not have that video codec in its supported codecs, or the audio codec and so the server is going to transcode



it has something to do with how you are starting playback, it doesn't know "admin" is playing it

i do not know how to set codec options for an anonymous profile


RE: Transcoding instead of Remuxing - thornbill - 2023-11-19

One small correction… "Anonymous Profile" refers to the playback profile a client submits to the server specifying which media formats are supported. It’s not user specific.

Otherwise, great job clarifying this! 👍


RE: Transcoding instead of Remuxing - jussme - 2023-11-20

So why is remuxing not happening?

For a file with the same codecs, but in MP4 i get this:
Code:
[2023-11-20 11:48:38.706 +01:00] [INF] [110] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "admin". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[2023-11-20 11:48:38.707 +01:00] [DBG] [110] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: "Unknown Profile", Path: "/media/series/other_series/S01/e01.mp4", isEligibleForDirectPlay: True, isEligibleForDirectStream: False
[2023-11-20 11:48:38.717 +01:00] [DBG] [110] Jellyfin.Api.Helpers.MediaInfoHelper: DirectPlay Result for Profile: "Anonymous Profile", Path: "/media/series/other_series/S01/e01.mp4", PlayMethod: DirectPlay, AudioStreamIndex: 2, SubtitleStreamIndex: 0, Reasons: 0

Those are the same codecs, HEVC main 10 for video and AAC 5.1 for audio. And i get direct play.

Why do HEVC main 10 and AAC 5.1 in MKV do not result in remuxing to MP4? I though that was supposed to happen.


RE: Transcoding instead of Remuxing - tmsrxzar - 2023-11-20

That device/browser reported to Jellyfin that it was not capable and so Jellyfin is transcoding.


What "device" and "operating system" is the client Chrome running on?


RE: Transcoding instead of Remuxing - jussme - 2023-11-20

The Chrome version: Chrome/119.0.6045.160
Operating system: Windows NT 10.0.19045

The GPU is an integrated Intel UHD 620 on a laptop i5-8250U.

In chrome://gpu it lists Decode hevc main 10 : 64x64 to 8192x8192 pixels.
When watching test HEVC videos, chrome://media-internals shows D3D11VideoDecoder being used.


RE: Transcoding instead of Remuxing - tmsrxzar - 2023-11-20

read everything i can find on the subject but it doesn't work for me under chrome 119 either (on linux) despite the codecs page saying it does
https://jellyfin.org/docs/general/clients/codec-support/

i even tried the flag --enable-features=PlatformHEVCDecoderSupport and nothing

recommend until it is worked out that you try the jellyfin player windows client instead of using chrome in the mean time https://jellyfin.org/downloads/


RE: Transcoding instead of Remuxing - jussme - 2023-11-22

The issue was outlined in github.com/jellyfin/jellyfin/issues/10549.

Should work on v.10.9 when it releases.