diff --git a/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs b/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs index 300c075cf..9ac603db2 100644 --- a/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs +++ b/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs @@ -107,7 +107,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg } [Test] - public void ShouldNot_SetRealtime_ForHttpLiveStreaming() + public void Should_SetRealtime_ForHttpLiveStreaming() { FFmpegProfile ffmpegProfile = TestProfile(); @@ -120,7 +120,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg DateTimeOffset.Now, DateTimeOffset.Now); - actual.RealtimeOutput.Should().BeFalse(); + actual.RealtimeOutput.Should().BeTrue(); } [Test] diff --git a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs index 0e076e7ab..89ae37382 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs @@ -18,7 +18,6 @@ namespace ErsatzTV.Core.FFmpeg private string _inputCodec; private bool _normalizeLoudness; private Option _padToSize = None; - private bool _realtime; private Option _scaleToSize = None; public FFmpegComplexFilterBuilder WithHardwareAcceleration(HardwareAccelerationKind hardwareAccelerationKind) @@ -27,12 +26,6 @@ namespace ErsatzTV.Core.FFmpeg return this; } - public FFmpegComplexFilterBuilder WithRealtime(bool realtime) - { - _realtime = realtime; - return this; - } - public FFmpegComplexFilterBuilder WithScaling(IDisplaySize scaleToSize) { _scaleToSize = Some(scaleToSize); @@ -102,11 +95,6 @@ namespace ErsatzTV.Core.FFmpeg _audioDuration.IfSome( audioDuration => audioFilterQueue.Add($"apad=whole_dur={audioDuration.TotalMilliseconds}ms")); - if (_realtime) - { - videoFilterQueue.Add("realtime"); - } - bool usesHardwareFilters = acceleration != HardwareAccelerationKind.None && !isHardwareDecode && (_deinterlace || _scaleToSize.IsSome); if (usesHardwareFilters) diff --git a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs index abd239946..9c49ded3e 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs @@ -12,7 +12,7 @@ namespace ErsatzTV.Core.FFmpeg public List FormatFlags { get; set; } public HardwareAccelerationKind HardwareAcceleration { get; set; } public string VideoDecoder { get; set; } - public bool RealtimeOutput { get; set; } + public bool RealtimeOutput => true; public Option StreamSeek { get; set; } public Option ScaledSize { get; set; } public bool PadToDesiredResolution { get; set; } diff --git a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs index b1d17cedb..1f730af3d 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs @@ -68,10 +68,8 @@ namespace ErsatzTV.Core.FFmpeg result.AudioCodec = "copy"; result.VideoCodec = "copy"; result.Deinterlace = false; - result.RealtimeOutput = false; break; case StreamingMode.TransportStream: - result.RealtimeOutput = true; result.HardwareAcceleration = ffmpegProfile.HardwareAcceleration; if (NeedToScale(ffmpegProfile, version)) diff --git a/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs b/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs index 8d910c284..629c1163f 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs @@ -90,7 +90,11 @@ namespace ErsatzTV.Core.FFmpeg public FFmpegProcessBuilder WithRealtimeOutput(bool realtimeOutput) { - _complexFilterBuilder = _complexFilterBuilder.WithRealtime(realtimeOutput); + if (realtimeOutput) + { + _arguments.Add("-re"); + } + return this; } @@ -389,7 +393,7 @@ namespace ErsatzTV.Core.FFmpeg { FileName = _ffmpegPath, RedirectStandardOutput = true, - RedirectStandardError = true, + RedirectStandardError = false, UseShellExecute = false, CreateNoWindow = true, StandardOutputEncoding = Encoding.UTF8 diff --git a/docker/Dockerfile b/docker/Dockerfile index 31f3fe00c..a7e9fe1bf 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,6 @@ FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime -FROM jrottenberg/ffmpeg:4.4-ubuntu2004 AS runtime-base +FROM jrottenberg/ffmpeg:4.3-ubuntu2004 AS runtime-base COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata diff --git a/docker/nvidia/Dockerfile b/docker/nvidia/Dockerfile index c43344033..e7625f9b5 100644 --- a/docker/nvidia/Dockerfile +++ b/docker/nvidia/Dockerfile @@ -1,6 +1,6 @@ FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime -FROM jrottenberg/ffmpeg:4.4-nvidia1804 AS runtime-base +FROM jrottenberg/ffmpeg:4.3-nvidia1804 AS runtime-base COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata diff --git a/docker/vaapi/Dockerfile b/docker/vaapi/Dockerfile index f4038f059..7dee22662 100644 --- a/docker/vaapi/Dockerfile +++ b/docker/vaapi/Dockerfile @@ -1,6 +1,6 @@ FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime -FROM jrottenberg/ffmpeg:4.4-vaapi2004 AS runtime-base +FROM jrottenberg/ffmpeg:4.3-vaapi2004 AS runtime-base COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata