From 1ca0df038c6b927cbb78a4e22fbdbfed4f7f7952 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Wed, 28 Apr 2021 18:27:36 -0500 Subject: [PATCH] fix ffmpeg 4.4 compatibility --- .../FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs | 4 ++-- ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs | 12 ++++++++++++ ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs | 2 +- .../FFmpeg/FFmpegPlaybackSettingsCalculator.cs | 2 ++ ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs | 8 ++------ 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs b/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs index b3b4f5759..3f941b846 100644 --- a/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs +++ b/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs @@ -106,7 +106,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg } [Test] - public void Should_SetRealtime_ForHttpLiveStreaming() + public void ShouldNot_SetRealtime_ForHttpLiveStreaming() { FFmpegProfile ffmpegProfile = TestProfile(); @@ -119,7 +119,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg DateTimeOffset.Now, DateTimeOffset.Now); - actual.RealtimeOutput.Should().BeTrue(); + actual.RealtimeOutput.Should().BeFalse(); } [Test] diff --git a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs index 89ae37382..0e076e7ab 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs @@ -18,6 +18,7 @@ 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) @@ -26,6 +27,12 @@ namespace ErsatzTV.Core.FFmpeg return this; } + public FFmpegComplexFilterBuilder WithRealtime(bool realtime) + { + _realtime = realtime; + return this; + } + public FFmpegComplexFilterBuilder WithScaling(IDisplaySize scaleToSize) { _scaleToSize = Some(scaleToSize); @@ -95,6 +102,11 @@ 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 9c49ded3e..abd239946 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 => true; + public bool RealtimeOutput { get; set; } 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 230186b20..122fa16ff 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs @@ -68,8 +68,10 @@ 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 629c1163f..8d910c284 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs @@ -90,11 +90,7 @@ namespace ErsatzTV.Core.FFmpeg public FFmpegProcessBuilder WithRealtimeOutput(bool realtimeOutput) { - if (realtimeOutput) - { - _arguments.Add("-re"); - } - + _complexFilterBuilder = _complexFilterBuilder.WithRealtime(realtimeOutput); return this; } @@ -393,7 +389,7 @@ namespace ErsatzTV.Core.FFmpeg { FileName = _ffmpegPath, RedirectStandardOutput = true, - RedirectStandardError = false, + RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, StandardOutputEncoding = Encoding.UTF8