From 2119c88c975c61316c480dc6fd3cf6db095a45af Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:15:02 -0600 Subject: [PATCH] always downsample after loudnorm (#1639) --- CHANGELOG.md | 2 ++ .../Filter/NormalizeLoudnessFilter.cs | 23 +++++++++++++++---- .../Pipeline/PipelineBuilderBase.cs | 8 ++++--- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cea3cc090..6f8bcae5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Allow playback of items with any positive duration, including less than one second - Fix VAAPI transcoding of OTA content containing A53 CC data - Fix AV1 software decoder priority (`libdav1d`, `libaom-av1`, `av1`) +- Fix some stream failures caused by loudnorm filter ### Changed - Log search index updates under scanner category at debug level, to indicate a potential cause for the UI being out of date @@ -55,6 +56,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Do not unnecessarily update the search index during media server library scans - Use different library for reading song metadata that supports multiple tag entries - Update `/iptv` routing to make UI completely inaccessible from that path prefix +- Use CUDA 11 instead of CUDA 12 in NVIDIA docker image to significantly lower required driver version ## [0.8.5-beta] - 2024-01-30 ### Added diff --git a/ErsatzTV.FFmpeg/Filter/NormalizeLoudnessFilter.cs b/ErsatzTV.FFmpeg/Filter/NormalizeLoudnessFilter.cs index a188b9e8e..d5daaa32c 100644 --- a/ErsatzTV.FFmpeg/Filter/NormalizeLoudnessFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/NormalizeLoudnessFilter.cs @@ -2,15 +2,28 @@ public class NormalizeLoudnessFilter : BaseFilter { + private readonly Option _audioSampleRate; private readonly AudioFilter _loudnessFilter; - public NormalizeLoudnessFilter(AudioFilter loudnessFilter) => _loudnessFilter = loudnessFilter; + public NormalizeLoudnessFilter(AudioFilter loudnessFilter, Option audioSampleRate) + { + _loudnessFilter = loudnessFilter; + _audioSampleRate = audioSampleRate; + } - public override string Filter => _loudnessFilter switch + public override string Filter { - AudioFilter.LoudNorm => "loudnorm=I=-16:TP=-1.5:LRA=11", - _ => string.Empty - }; + get + { + int audioSampleRate = _audioSampleRate.IfNone(48) * 1000; + + return _loudnessFilter switch + { + AudioFilter.LoudNorm => $"loudnorm=I=-16:TP=-1.5:LRA=11,aresample={audioSampleRate}", + _ => string.Empty + }; + } + } public override FrameState NextState(FrameState currentState) => currentState; } diff --git a/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs b/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs index cb07032fd..c80ac19a5 100644 --- a/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs +++ b/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs @@ -416,9 +416,11 @@ public abstract class PipelineBuilderBase : IPipelineBuilder { if (audioInputFile.DesiredState.NormalizeLoudnessFilter is not AudioFilter.None) { - _audioInputFile.Iter( - f => f.FilterSteps.Add( - new NormalizeLoudnessFilter(audioInputFile.DesiredState.NormalizeLoudnessFilter))); + var filter = new NormalizeLoudnessFilter( + audioInputFile.DesiredState.NormalizeLoudnessFilter, + audioInputFile.DesiredState.AudioSampleRate); + + _audioInputFile.Iter(f => f.FilterSteps.Add(filter)); } }