Align navigating video with frame when in frame-time-code-mode

Related to #7105
This commit is contained in:
Nikolaj Olsson 2024-09-19 07:54:52 +02:00
parent dbe07ab735
commit f667fef5c7
3 changed files with 33 additions and 4 deletions

View File

@ -347,5 +347,27 @@ namespace Nikse.SubtitleEdit.Core.Common
return ToShortString(true);
}
/// <summary>
/// Align time to frame rate.
/// </summary>
public TimeCode AlignToFrame()
{
var ts = TimeSpan.FromMilliseconds(Math.Round(TotalMilliseconds, MidpointRounding.AwayFromZero));
var frames = Math.Round(ts.Milliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate));
TimeSpan ts2;
if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001)
{
ts = ts.Add(new TimeSpan(0, 0, 1));
ts2 = new TimeSpan(ts.Days, ts.Hours, ts.Minutes, ts.Seconds, 0);
}
else
{
var ms = SubtitleFormat.FramesToMillisecondsMax999(SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds));
ts2 = new TimeSpan(ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ms);
}
return new TimeCode(ts2.TotalMilliseconds);
}
}
}

View File

@ -2023,14 +2023,20 @@ namespace Nikse.SubtitleEdit.Controls
{
if (VideoPlayer != null)
{
var v = value;
if (SmpteMode)
{
VideoPlayer.CurrentPosition = value * 1.001;
v *= 1.001;
}
else
if (Configuration.Settings.General.UseTimeFormatHHMMSSFF)
{
VideoPlayer.CurrentPosition = value;
var tc = TimeCode.FromSeconds(v);
v = tc.AlignToFrame().TotalSeconds; ;
}
VideoPlayer.CurrentPosition = v;
}
else
{

View File

@ -241,7 +241,7 @@ namespace Nikse.SubtitleEdit.Logic.VideoPlayers
_pausePosition = value;
}
DoMpvCommand("seek", value.ToString(CultureInfo.InvariantCulture), "absolute");
DoMpvCommand("seek", value.ToString(CultureInfo.InvariantCulture), "absolute", "exact");
}
}
}
@ -740,6 +740,7 @@ namespace Nikse.SubtitleEdit.Logic.VideoPlayers
_mpvSetOptionString(_mpvHandle, GetUtf8Bytes("keep-open"), GetUtf8Bytes("always")); // don't auto close video
_mpvSetOptionString(_mpvHandle, GetUtf8Bytes("no-sub"), GetUtf8Bytes(string.Empty)); // don't load subtitles (does not seem to work anymore)
_mpvSetOptionString(_mpvHandle, GetUtf8Bytes("sid"), GetUtf8Bytes("no")); // don't load subtitles
_mpvSetOptionString(_mpvHandle, GetUtf8Bytes("hr-seek"), GetUtf8Bytes("yes")); // don't load subtitles
if (videoFileName.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
videoFileName.StartsWith("https://", StringComparison.OrdinalIgnoreCase))