diff --git a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs index 8519ff6b2..e7c0e0978 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettings.cs @@ -27,5 +27,6 @@ namespace ErsatzTV.Core.FFmpeg public string AudioCodec { get; set; } public bool Deinterlace { get; set; } public Option FrameRate { get; set; } + public Option VideoTrackTimeScale { get; set; } } } diff --git a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs index f669742ea..320a91e29 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs @@ -91,6 +91,8 @@ namespace ErsatzTV.Core.FFmpeg result.FrameRate = string.IsNullOrWhiteSpace(ffmpegProfile.FrameRate) ? None : Some(ffmpegProfile.FrameRate); + + result.VideoTrackTimeScale = 90000; } if (result.ScaledSize.IsSome || result.PadToDesiredResolution || diff --git a/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs b/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs index 8dfecf109..402852ebc 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs @@ -330,6 +330,16 @@ namespace ErsatzTV.Core.FFmpeg return this; } + public FFmpegProcessBuilder WithVideoTrackTimeScale(Option videoTrackTimeScale) + { + videoTrackTimeScale.IfSome(timeScale => + { + _arguments.Add("-video_track_timescale"); + _arguments.Add($"{timeScale}"); + }); + return this; + } + public FFmpegProcessBuilder WithDeinterlace(bool deinterlace) { _complexFilterBuilder = _complexFilterBuilder.WithDeinterlace(deinterlace); diff --git a/ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs b/ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs index 574439889..f4e28e786 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs @@ -49,7 +49,8 @@ namespace ErsatzTV.Core.FFmpeg .WithRealtimeOutput(playbackSettings.RealtimeOutput) .WithSeek(playbackSettings.StreamSeek) .WithInputCodec(path, playbackSettings.HardwareAcceleration, videoStream.Codec) - .WithFrameRate(playbackSettings.FrameRate); + .WithFrameRate(playbackSettings.FrameRate) + .WithVideoTrackTimeScale(playbackSettings.VideoTrackTimeScale); playbackSettings.ScaledSize.Match( scaledSize =>