mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-22 07:30:52 +01:00
Merge pull request #17090 from moontwister/fix/audio-sample-rate-non-opus-17026
Fix audio sample rate forced to 48 kHz for non-Opus codecs
This commit is contained in:
@@ -7870,13 +7870,14 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||
audioTranscodeParams.Add("-ar " + state.BaseRequest.AudioBitRate);
|
||||
}
|
||||
|
||||
if (!string.Equals(outputCodec, "opus", StringComparison.OrdinalIgnoreCase))
|
||||
var sampleRate = state.OutputAudioSampleRate;
|
||||
if (sampleRate.HasValue)
|
||||
{
|
||||
// opus only supports specific sampling rates
|
||||
var sampleRate = state.OutputAudioSampleRate;
|
||||
if (sampleRate.HasValue)
|
||||
var sampleRateValue = sampleRate.Value;
|
||||
if (string.Equals(outputCodec, "opus", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var sampleRateValue = sampleRate.Value switch
|
||||
// opus only supports specific sampling rates
|
||||
sampleRateValue = sampleRate.Value switch
|
||||
{
|
||||
<= 8000 => 8000,
|
||||
<= 12000 => 12000,
|
||||
@@ -7884,9 +7885,9 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||
<= 24000 => 24000,
|
||||
_ => 48000
|
||||
};
|
||||
|
||||
audioTranscodeParams.Add("-ar " + sampleRateValue.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
audioTranscodeParams.Add("-ar " + sampleRateValue.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
// Copy the movflags from GetProgressiveVideoFullCommandLine
|
||||
|
||||
@@ -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