Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

No sound when playing transcoded Video with FLAC audio stream #907

Open
b-m-f opened this issue Aug 15, 2024 · 4 comments
Open

No sound when playing transcoded Video with FLAC audio stream #907

b-m-f opened this issue Aug 15, 2024 · 4 comments

Comments

@b-m-f
Copy link

b-m-f commented Aug 15, 2024

It seems to be related to jellyfin/jellyfin#8224 (comment).

Playing any video file - transcoded - will result in no audio when the FLAC track is selected.

This is not an issue when direct-playing the video file. All audio codecs work fine then.
Also all other clients tested by me:

  • Android (web and native player)
  • web player
  • Linux desktop app
  • IOS

Work without the audio dropping.

@xingoxu
Copy link

xingoxu commented Aug 26, 2024

Same here. I've enabled forced transcoding and chose the aac / ac3 for audio codec but I see ffmpeg command still uses flac.

jellyfin-1  | [17:45:51] [INF] [78] MediaBrowser.MediaEncoding.Transcoding.TranscodeManager: /usr/lib/jellyfin-ffmpeg/ffmpeg -analyzeduration 200M -probesize 1G -init_hw_device vaapi=va:,kernel_driver=i915,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -noautorotate -i file:"/data/Anime/Buddy Complex/Season 1/S01E01.mkv" -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_qsv -preset veryfast -look_ahead 0 -b:v 12021144 -maxrate 12021144 -bufsize 24042288 -profile:v:0 high -level 50 -g:v:0 72 -keyint_min:v:0 72 -vf "setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,scale=trunc(min(max(iw\,ih*a)\,min(2841\,1344*a))/2)*2:trunc(min(max(iw/a\,ih)\,min(2841/a\,1344))/2)*2,format=nv12" -codec:a:0 flac -ac 2 -ar 48000 -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_segment_filename "/cache/transcode/39d9628a7c81be3da744e6f9b0d35989%d.ts" -hls_playlist_type vod -hls_list_size 0 -y "/cache/transcode/39d9628a7c81be3da744e6f9b0d35989.m3u8"

@Nocifer
Copy link

Nocifer commented Sep 11, 2024

Gah, this issue has been my single personal annoyance with Jellyfin for years now. I was under the impression that it's a Jellyfin server issue, but the people over at Jellyfin server have recently stated that this should not be an issue on their end (which is supported by the fact that other clients do not have this issue), so I guess the problem is with the Jellyfin Kodi plugin after all.

Skimming through the code for a whole of 5 minutes I stumbled on this (in helper/playutils.py):

    def get_transcoding_audio_codec(self):
        codecs = ["aac", "mp3", "ac3", "opus", "flac", "vorbis"]

...followed by this:

    "TranscodingProfiles": [
                {
                    "Type": "Video",
                    "Container": "m3u8",
                    "AudioCodec": self.get_transcoding_audio_codec(),
                    ...

Now, if I'm getting this right (and I could very well be way off, seeing as I've pretty much only read this part of the code) it seems like the plugin advertises the audio formats it supports for transcoding into as the above codecs array, which includes FLAC. And if my understanding is right, then during transcoding we should never be attempting to use FLAC as the audio codec, even if the device supports it natively during direct play.

So perhaps if FLAC were to be removed from this array, the issue could be fixed?

@oddstr13
Copy link
Member

def get_transcoding_audio_codec(self):
codecs = ["aac", "mp3", "ac3", "opus", "flac", "vorbis"]
preferred = settings("audioPreferredCodec").lower()
if preferred in codecs:
codecs.insert(0, codecs.pop(codecs.index(preferred)))
return ",".join(codecs)

Removing flac from that list would likely cause it to get transcoded into aac (by default – audioPreferredCodec setting)

Video codecs have a few settings to force transcoding of mp2, hevc, av1 and vc1
Adding similar settings for audio codecs would be feasible

def get_transcoding_video_codec(self):
codecs = ["h264", "mpeg4", "mpeg2video", "vc1"]
if settings("videoPreferredCodec") == "H265/HEVC":
codecs.insert(0, "hevc")
elif not settings("transcode_h265.bool"):
codecs.insert(1, "hevc")
if settings("videoPreferredCodec") == "AV1":
codecs.insert(0, "av1")
elif not settings("transcode_av1.bool"):
codecs.append("av1")
if settings("transcode_mpeg2.bool"):
codecs.remove("mpeg2video")
if settings("transcode_vc1.bool"):
codecs.remove("vc1")
return ",".join(codecs)

@Nocifer
Copy link

Nocifer commented Sep 12, 2024

Yeah, so it works more or less as I Imagined. If everything stays at the default state, then during transcoding the audio will get transcoded to the widely compatible AAC by default (with a list of further possible candidates), just like video will get transcoded to the widely compatible H.264 by default (with, again, a list of further candidates).

For the video part, the user can opt to select something else in the settings as the preferred video codec to transcode into, and the same functionality could (and should) be added to the audio part, because it's very useful (for example, some specific audio format could be supported for pass-through on some specific sound device, although that's often enough the case with the default AAC).

But aside from all that, this specific issue arises from the fact that FLAC is also included in that list of possible format candidates, so when the system tries to transcode a media file which contains FLAC audio, the audio part is considered as already compatible and so is left untouched, and is then (attempted to be) muxed into the TS container with the transcoded video stream, but the TS container doesn't support FLAC audio, which leads to the issue.

So yes, I think the proper solution here should be to remove FLAC from the possible transcode candidates and so let FLAC audio streams be transcoded to AAC as they should.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants