mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-22 15:40:45 +01:00
Fix audio sample rate forced to 48 kHz for non-Opus codecs
GetProgressiveAudioFullCommandLine applied the libopus-only sample rate quantization to every codec except Opus, inverting the intended guard. A requested rate such as 44100 Hz was therefore snapped to 48000 Hz for AAC/MP3/FLAC, while Opus (which actually requires the quantization) was skipped entirely. Apply the quantization only when the output codec is Opus, and pass the requested sample rate through unchanged for all other codecs. Fixes #17026 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ using MediaBrowser.Model.Configuration;
|
||||
using MediaBrowser.Model.Dlna;
|
||||
using MediaBrowser.Model.Dto;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.MediaInfo;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
@@ -203,6 +204,50 @@ public class EncodingHelperTests
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("aac", 44100, 44100)] // non-opus: requested rate must be preserved (issue #17026)
|
||||
[InlineData("aac", 48000, 48000)]
|
||||
[InlineData("mp3", 22050, 22050)]
|
||||
[InlineData("flac", 96000, 96000)]
|
||||
[InlineData("opus", 44100, 48000)] // opus: must snap to a libopus-supported rate
|
||||
[InlineData("opus", 22050, 24000)]
|
||||
[InlineData("opus", 8000, 8000)]
|
||||
public void GetProgressiveAudioFullCommandLine_SampleRate_OnlyClampedForOpus(
|
||||
string audioCodec,
|
||||
int requestedSampleRate,
|
||||
int expectedSampleRate)
|
||||
{
|
||||
var state = BuildAudioState(audioCodec, requestedSampleRate);
|
||||
var args = CreateHelper().GetProgressiveAudioFullCommandLine(state, new EncodingOptions(), "/tmp/out");
|
||||
|
||||
Assert.Contains("-ar " + expectedSampleRate, args, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
private static EncodingJobInfo BuildAudioState(string audioCodec, int requestedSampleRate)
|
||||
{
|
||||
var audio = new MediaStream { Index = 0, Type = MediaStreamType.Audio, Codec = "flac", SampleRate = 96000 };
|
||||
|
||||
return new EncodingJobInfo(TranscodingJobType.Progressive)
|
||||
{
|
||||
MediaSource = new MediaSourceInfo
|
||||
{
|
||||
Container = "flac",
|
||||
MediaStreams = new List<MediaStream> { audio },
|
||||
Path = "/media/track.flac",
|
||||
Protocol = MediaProtocol.File,
|
||||
},
|
||||
AudioStream = audio,
|
||||
OutputAudioCodec = audioCodec,
|
||||
BaseRequest = new VideoRequestDto
|
||||
{
|
||||
AudioCodec = audioCodec,
|
||||
AudioSampleRate = requestedSampleRate,
|
||||
},
|
||||
IsVideoRequest = false,
|
||||
IsInputVideo = false,
|
||||
};
|
||||
}
|
||||
|
||||
private static EncodingJobInfo BuildState(
|
||||
MediaStream? subtitle,
|
||||
SubtitleDeliveryMethod? deliveryMethod,
|
||||
|
||||
Reference in New Issue
Block a user