Browse Source

upgrade to ffmpeg 4.4 (#182)

* bump docker images from ffmpeg 4.3 to 4.4 (#181)

* fix ffmpeg 4.4 compatibility
pull/183/head
Jason Dove 4 years ago committed by GitHub
parent
commit
b178b7402b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs
  2. 12
      ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs
  3. 2
      ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs
  4. 2
      ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs
  5. 8
      ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs
  6. 2
      docker/Dockerfile
  7. 2
      docker/nvidia/Dockerfile
  8. 2
      docker/vaapi/Dockerfile

4
ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs

@ -106,7 +106,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
} }
[Test] [Test]
public void Should_SetRealtime_ForHttpLiveStreaming() public void ShouldNot_SetRealtime_ForHttpLiveStreaming()
{ {
FFmpegProfile ffmpegProfile = TestProfile(); FFmpegProfile ffmpegProfile = TestProfile();
@ -119,7 +119,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
DateTimeOffset.Now, DateTimeOffset.Now,
DateTimeOffset.Now); DateTimeOffset.Now);
actual.RealtimeOutput.Should().BeTrue(); actual.RealtimeOutput.Should().BeFalse();
} }
[Test] [Test]

12
ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs

@ -18,6 +18,7 @@ namespace ErsatzTV.Core.FFmpeg
private string _inputCodec; private string _inputCodec;
private bool _normalizeLoudness; private bool _normalizeLoudness;
private Option<IDisplaySize> _padToSize = None; private Option<IDisplaySize> _padToSize = None;
private bool _realtime;
private Option<IDisplaySize> _scaleToSize = None; private Option<IDisplaySize> _scaleToSize = None;
public FFmpegComplexFilterBuilder WithHardwareAcceleration(HardwareAccelerationKind hardwareAccelerationKind) public FFmpegComplexFilterBuilder WithHardwareAcceleration(HardwareAccelerationKind hardwareAccelerationKind)
@ -26,6 +27,12 @@ namespace ErsatzTV.Core.FFmpeg
return this; return this;
} }
public FFmpegComplexFilterBuilder WithRealtime(bool realtime)
{
_realtime = realtime;
return this;
}
public FFmpegComplexFilterBuilder WithScaling(IDisplaySize scaleToSize) public FFmpegComplexFilterBuilder WithScaling(IDisplaySize scaleToSize)
{ {
_scaleToSize = Some(scaleToSize); _scaleToSize = Some(scaleToSize);
@ -95,6 +102,11 @@ namespace ErsatzTV.Core.FFmpeg
_audioDuration.IfSome( _audioDuration.IfSome(
audioDuration => audioFilterQueue.Add($"apad=whole_dur={audioDuration.TotalMilliseconds}ms")); audioDuration => audioFilterQueue.Add($"apad=whole_dur={audioDuration.TotalMilliseconds}ms"));
if (_realtime)
{
videoFilterQueue.Add("realtime");
}
bool usesHardwareFilters = acceleration != HardwareAccelerationKind.None && !isHardwareDecode && bool usesHardwareFilters = acceleration != HardwareAccelerationKind.None && !isHardwareDecode &&
(_deinterlace || _scaleToSize.IsSome); (_deinterlace || _scaleToSize.IsSome);
if (usesHardwareFilters) if (usesHardwareFilters)

2
ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs

@ -12,7 +12,7 @@ namespace ErsatzTV.Core.FFmpeg
public List<string> FormatFlags { get; set; } public List<string> FormatFlags { get; set; }
public HardwareAccelerationKind HardwareAcceleration { get; set; } public HardwareAccelerationKind HardwareAcceleration { get; set; }
public string VideoDecoder { get; set; } public string VideoDecoder { get; set; }
public bool RealtimeOutput => true; public bool RealtimeOutput { get; set; }
public Option<TimeSpan> StreamSeek { get; set; } public Option<TimeSpan> StreamSeek { get; set; }
public Option<IDisplaySize> ScaledSize { get; set; } public Option<IDisplaySize> ScaledSize { get; set; }
public bool PadToDesiredResolution { get; set; } public bool PadToDesiredResolution { get; set; }

2
ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs

@ -68,8 +68,10 @@ namespace ErsatzTV.Core.FFmpeg
result.AudioCodec = "copy"; result.AudioCodec = "copy";
result.VideoCodec = "copy"; result.VideoCodec = "copy";
result.Deinterlace = false; result.Deinterlace = false;
result.RealtimeOutput = false;
break; break;
case StreamingMode.TransportStream: case StreamingMode.TransportStream:
result.RealtimeOutput = true;
result.HardwareAcceleration = ffmpegProfile.HardwareAcceleration; result.HardwareAcceleration = ffmpegProfile.HardwareAcceleration;
if (NeedToScale(ffmpegProfile, version)) if (NeedToScale(ffmpegProfile, version))

8
ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs

@ -90,11 +90,7 @@ namespace ErsatzTV.Core.FFmpeg
public FFmpegProcessBuilder WithRealtimeOutput(bool realtimeOutput) public FFmpegProcessBuilder WithRealtimeOutput(bool realtimeOutput)
{ {
if (realtimeOutput) _complexFilterBuilder = _complexFilterBuilder.WithRealtime(realtimeOutput);
{
_arguments.Add("-re");
}
return this; return this;
} }
@ -393,7 +389,7 @@ namespace ErsatzTV.Core.FFmpeg
{ {
FileName = _ffmpegPath, FileName = _ffmpegPath,
RedirectStandardOutput = true, RedirectStandardOutput = true,
RedirectStandardError = false, RedirectStandardError = true,
UseShellExecute = false, UseShellExecute = false,
CreateNoWindow = true, CreateNoWindow = true,
StandardOutputEncoding = Encoding.UTF8 StandardOutputEncoding = Encoding.UTF8

2
docker/Dockerfile

@ -1,6 +1,6 @@
FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime
FROM jrottenberg/ffmpeg:4.3-ubuntu2004 AS runtime-base FROM jrottenberg/ffmpeg:4.4-ubuntu2004 AS runtime-base
COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet
RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata

2
docker/nvidia/Dockerfile

@ -1,6 +1,6 @@
FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime
FROM jrottenberg/ffmpeg:4.3-nvidia1804 AS runtime-base FROM jrottenberg/ffmpeg:4.4-nvidia1804 AS runtime-base
COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet
RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata

2
docker/vaapi/Dockerfile

@ -1,6 +1,6 @@
FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime
FROM jrottenberg/ffmpeg:4.3-vaapi1804 AS runtime-base FROM jrottenberg/ffmpeg:4.4-vaapi2004 AS runtime-base
COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet
RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata

Loading…
Cancel
Save