Jellyfin Forum
VP9 on Android Exoplayer transcoding - Printable Version

+- Jellyfin Forum (https://forum.jellyfin.org)
+-- Forum: Support (https://forum.jellyfin.org/f-support)
+--- Forum: General Questions (https://forum.jellyfin.org/f-general-questions)
+--- Thread: VP9 on Android Exoplayer transcoding (/t-vp9-on-android-exoplayer-transcoding)

Pages: 1 2


VP9 on Android Exoplayer transcoding - tbjf - 2024-03-11

Hi all,

I'm really loving jellyfin. I use it on my Android TV on my NVIDIA Shield without problems.

I've got a little script that [media sourcing discussions not allowed - TDP], which are in VP9 format.

This plays on my TV without concern. (With Exoplayer as the player)

On my phone I use Exoplayer as I have a lot of H265 media. But for some reason VP9 is reported as not being supported.

This happens with all vp9s, even SD, low bitrate, normal frame rate ones.

Anyway, surely Exoplayer can play VP9 format? But why does the android phone app report it as not supported?


Log for details:

User policy EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
 [INF] StreamBuilder.BuildVideoItem( Profile="Jellyfin Android", Path="/home/Videos/vp9_video.mp4", AudioStreamIndex=1, SubtitleStreamIndex=-1 ) => ( PlayMethod=Transcode, TranscodeReason=VideoCodecNotSupported ) "mediaConfused-facevideos/34827e67-e677-dc32-606d-384a38a96379/master.m3u8?MediaSourceId=34827e67e677dc32606d384a38a96379&VideoCodec=h264&AudioCodec=aac&AudioStreamIndex=1&VideoBitrate=119872001&AudioBitrate=127999&AudioSampleRate=44100&MaxFramerate=60.001877&api_key=<token>&SubtitleMethod=Encode&RequireAvc=false&Tag=1a84048a2d34de3240b5bf4f45893860&SegmentContainer=ts&BreakOnNonKeyFrames=False&vp9-level=-99&vp9-videobitdepth=8&vp9-profile=profile0&vp9-audiochannels=2&aac-profile=lc&TranscodeReasons=VideoCodecNotSupported"


RE: VP9 on Android Exoplayer transcoding - TheDreadPirate - 2024-03-11

What phone do you have? Exo supports VP9 but, perhaps, your phone SOC does not.


RE: VP9 on Android Exoplayer transcoding - tbjf - 2024-03-11

It's a Samsung S23 (meant to put it in but couldn't remember the exact model as these phones have been pretty similar over the last few years).

Also, vp9 works for me on the web player.


From aida64 (couldn't copy paste more than this)
video/x-vnd.on2.vp9


RE: VP9 on Android Exoplayer transcoding - TheDreadPirate - 2024-03-11

On the server, turn on debug logging. When debug logging is on it will log the "device profile" it receives from the client. The device profile will list the codec+container compatibility reported by your phone.

https://jellyfin.org/docs/general/administration/troubleshooting/#debug-logging


RE: VP9 on Android Exoplayer transcoding - tbjf - 2024-03-11

I've got this from the transcode log?
Is that it?

{"Protocol":0,"Id":"34827e67e677dc32606d384a38a96379","Path":"/home/Videos/vp9example.mp4","EncoderPath":null,"EncoderProtocol":null,"Type":0,"Container":"mov,mp4,m4a,3gp,3g2,mj2","Size":232018624,"Name":"vp9example","IsRemote":false,"ETag":"1a84048a2d34de3240b5bf4f45893860","RunTimeTicks":5437190144,"ReadAtNativeFramerate":false,"IgnoreDts":false,"IgnoreIndex":false,"GenPtsInput":false,"SupportsTranscoding":true,"SupportsDirectStream":true,"SupportsDirectPlay":true,"IsInfiniteStream":false,"RequiresOpening":false,"OpenToken":null,"RequiresClosing":false,"LiveStreamId":null,"BufferMs":null,"RequiresLooping":false,"SupportsProbing":true,"VideoType":0,"IsoType":null,"Video3DFormat":null,"MediaStreams":[{"Codec":"vp9","CodecTag":"vp09","Language":"und","ColorRange":null,"ColorSpace":"bt709","ColorTransfer":"bt709","ColorPrimaries":"bt709","DvVersionMajor":null,"DvVersionMinor":null,"DvProfile":null,"DvLevel":null,"RpuPresentFlag":null,"ElPresentFlag":null,"BlPresentFlag":null,"DvBlSignalCompatibilityId":null,"Comment":null,"TimeBase":"1/16000","CodecTimeBase":null,"Title":null,"VideoRange":"SDR","VideoRangeType":"SDR","VideoDoViTitle":null,"LocalizedUndefined":null,"LocalizedDefault":null,"LocalizedForced":null,"LocalizedExternal":null,"DisplayTitle":"1080p VP9 SDR","NalLengthSize":null,"IsInterlaced":false,"IsAVC":null,"ChannelLayout":null,"BitRate":3274419,"BitDepth":8,"RefFrames":1,"PacketLength":null,"Channels":null,"SampleRate":null,"IsDefault":true,"IsForced":false,"Height":1080,"Width":1920,"AverageFrameRate":60.001877,"RealFrameRate":60,"Profile":"Profile 0","Type":1,"AspectRatio":"16:9","Index":0,"Score":null,"IsExternal":false,"DeliveryMethod":null,"DeliveryUrl":null,"IsExternalUrl":null,"IsTextSubtitleStream":false,"SupportsExternalStream":false,"Path":null,"PixelFormat":"yuv420p","Level":-99,"IsAnamorphic":null},{"Codec":"aac","CodecTag":"mp4a","Language":"eng","ColorRange":null,"ColorSpace":null,"ColorTransfer":null,"ColorPrimaries":null,"DvVersionMajor":null,"DvVersionMinor":null,"DvProfile":null,"DvLevel":null,"RpuPresentFlag":null,"ElPresentFlag":null,"BlPresentFlag":null,"DvBlSignalCompatibilityId":null,"Comment":null,"TimeBase":"1/44100","CodecTimeBase":null,"Title":"ISO Media file produced by Google Inc.","VideoRange":null,"VideoRangeType":null,"VideoDoViTitle":null,"LocalizedUndefined":null,"LocalizedDefault":null,"LocalizedForced":null,"LocalizedExternal":null,"DisplayTitle":"ISO Media file produced by Google Inc. - English - AAC - Stereo - Default","NalLengthSize":null,"IsInterlaced":false,"IsAVC":null,"ChannelLayout":"stereo","BitRate":127999,"BitDepth":null,"RefFrames":null,"PacketLength":null,"Channels":2,"SampleRate":44100,"IsDefault":true,"IsForced":false,"Height":null,"Width":null,"AverageFrameRate":null,"RealFrameRate":null,"Profile":"LC","Type":0,"AspectRatio":null,"Index":1,"Score":null,"IsExternal":false,"DeliveryMethod":null,"DeliveryUrl":null,"IsExternalUrl":null,"IsTextSubtitleStream":false,"SupportsExternalStream":false,"Path":null,"PixelFormat":null,"Level":0,"IsAnamorphic":null}],"MediaAttachments":[],"Formats":[],"Bitrate":3413801,"Timestamp":null,"RequiredHttpHeaders":{},"TranscodingUrl":null,"TranscodingSubProtocol":null,"TranscodingContainer":null,"AnalyzeDurationMs":null,"DefaultAudioStreamIndex":null,"DefaultSubtitleStreamIndex":null}


RE: VP9 on Android Exoplayer transcoding - TheDreadPirate - 2024-03-11

Negative. That just the info about the file itself. In the device profile, only logged when debug is turned on, it will be a looooooong list of codec+container combinations that the device reports as supported to the server. And it will be written to the main Jellyfin log.


RE: VP9 on Android Exoplayer transcoding - tbjf - 2024-03-12

This must be it.

GetPostedPlaybackInfo profile: DeviceProfile { Name: "Jellyfin Android", 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: "", 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: "mp4", AudioCodec: "mp3,aac,alac,ac3", VideoCodec: "h263,mpeg4,h264,hevc,av1", Type: Video }, DirectPlayProfile { Container: "mp4", AudioCodec: "mp3,aac,alac,ac3", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "fmp4", AudioCodec: "mp3,aac,ac3,eac3", VideoCodec: "h263,mpeg4,h264,hevc,av1", Type: Video }, DirectPlayProfile { Container: "fmp4", AudioCodec: "mp3,aac,ac3,eac3", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "webm", AudioCodec: "vorbis,opus", VideoCodec: "vp8,vp9,av1", Type: Video }, DirectPlayProfile { Container: "webm", AudioCodec: "vorbis,opus", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "mkv", AudioCodec: "pcm_s8,pcm_s16be,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,pcm_alaw,pcm_mulaw,mp3,aac,vorbis,opus,flac,alac,ac3,eac3,dts,mlp,truehd", VideoCodec: "h263,mpeg4,h264,hevc,av1,vp8,vp9,av1", Type: Video }, DirectPlayProfile { Container: "mkv", AudioCodec: "pcm_s8,pcm_s16be,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,pcm_alaw,pcm_mulaw,mp3,aac,vorbis,opus,flac,alac,ac3,eac3,dts,mlp,truehd", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "mp3", AudioCodec: "mp3", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "ogg", AudioCodec: "vorbis,opus,flac", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "wav", AudioCodec: "pcm_s8,pcm_s16be,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,pcm_alaw,pcm_mulaw", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "mpegts", AudioCodec: "pcm_s8,pcm_s16be,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,pcm_alaw,pcm_mulaw,mp3,aac,ac3,eac3,dts,mlp,truehd", VideoCodec: "mpeg4,h264,hevc", Type: Video }, DirectPlayProfile { Container: "mpegts", AudioCodec: "pcm_s8,pcm_s16be,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,pcm_alaw,pcm_mulaw,mp3,aac,ac3,eac3,dts,mlp,truehd", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "flv", AudioCodec: "mp3,aac", VideoCodec: "mpeg4,h264", Type: Video }, DirectPlayProfile { Container: "flv", AudioCodec: "mp3,aac", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "aac", AudioCodec: "aac", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "flac", AudioCodec: "flac", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "3gp", AudioCodec: "3gpp,aac,flac", VideoCodec: "h263,mpeg4,h264,hevc", Type: Video }, DirectPlayProfile { Container: "3gp", AudioCodec: "3gpp,aac,flac", VideoCodec: null, Type: Audio }], TranscodingProfiles: [TranscodingProfile { Container: "ts", Type: Video, VideoCodec: "h264", AudioCodec: "mp1,mp2,mp3,aac,ac3,eac3,dts,mlp,truehd", Protocol: "hls", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: null, MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }, TranscodingProfile { Container: "mkv", Type: Video, VideoCodec: "h264", AudioCodec: "pcm_s8,pcm_s16be,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,pcm_alaw,pcm_mulaw,mp1,mp2,mp3,aac,vorbis,opus,flac,alac,ac3,eac3,dts,mlp,truehd", Protocol: "hls", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: null, 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: null, MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False, Conditions: [] }], ContainerProfiles: [ContainerProfile { Type: Video, Conditions: [], Container: "mp4" }, ContainerProfile { Type: Audio, Conditions: [], Container: "mp4" }, ContainerProfile { Type: Video, Conditions: [], Container: "fmp4" }, ContainerProfile { Type: Audio, Conditions: [], Container: "fmp4" }, ContainerProfile { Type: Video, Conditions: [], Container: "webm" }, ContainerProfile { Type: Audio, Conditions: [], Container: "webm" }, ContainerProfile { Type: Video, Conditions: [], Container: "mkv" }, ContainerProfile { Type: Audio, Conditions: [], Container: "mkv" }, ContainerProfile { Type: Audio, Conditions: [], Container: "mp3" }, ContainerProfile { Type: Audio, Conditions: [], Container: "ogg" }, ContainerProfile { Type: Audio, Conditions: [], Container: "wav" }, ContainerProfile { Type: Video, Conditions: [], Container: "mpegts" }, ContainerProfile { Type: Audio, Conditions: [], Container: "mpegts" }, ContainerProfile { Type: Video, Conditions: [], Container: "flv" }, ContainerProfile { Type: Audio, Conditions: [], Container: "flv" }, ContainerProfile { Type: Audio, Conditions: [], Container: "aac" }, ContainerProfile { Type: Audio, Conditions: [], Container: "flac" }, ContainerProfile { Type: Video, Conditions: [], Container: "3gp" }, ContainerProfile { Type: Audio, Conditions: [], Container: "3gp" }], CodecProfiles: [], ResponseProfiles: [], SubtitleProfiles: [SubtitleProfile { Format: "dvbsub", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "pgssub", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "srt", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "subrip", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ttml", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ssa", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ass", Method: Embed, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "srt", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "subrip", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ttml", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "vtt", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "webvtt", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ssa", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ass", Method: External, DidlMode: null, Language: null, Container: null }] }


RE: VP9 on Android Exoplayer transcoding - tbjf - 2024-03-12

It seems that it's the mp4 container that is causing the issue?

.webm and mkv seem to support vp9. How does that make sense?

Also, couldn't it then be remuxed rather than transcoded?


RE: VP9 on Android Exoplayer transcoding - TheDreadPirate - 2024-03-12

Code:
{ Container: "webm", AudioCodec: "vorbis,opus", VideoCodec: "vp8,vp9,av1"
{ Container: "mkv", AudioCodec: ....VideoCodec: "h263,mpeg4,h264,hevc,av1,vp8,vp9,av1"

Your VP9 video is in MP4, which is not in the compatibility list. From what I can find, MP4 never officially added VP9 support. Something about a draft proposal from Netflix, but nothing about it being ratified.

If you remuxed your video into MKV, it would probably direct play. As for why JF doesn't do that for you, Jellyfin currently only transcodes to the TS container. I can't find clear documentation TS supports VP9, which is probably the reason it is transcoded instead.


RE: VP9 on Android Exoplayer transcoding - tbjf - 2024-03-12

Thanks for that. I'll try converting them to MKV and reply for anyone who gets this issue in future.

Thanks very much for your help.

Would it be feasible for jellyfin to transcode to something other than Transport Stream? Especially for non-TS supported codecs?