diff --git a/LanguageMaster.xml b/LanguageMaster.xml
index c94461de3..085cd6cc2 100644
--- a/LanguageMaster.xml
+++ b/LanguageMaster.xml
@@ -2459,6 +2459,8 @@ can edit in same subtitle file (collaboration)
Go to next chapter
Select next subtitle (from video position, keep video pos)
Toggle play/pause
+ Play video with 1.5x speed
+ Play video with 2.0x speed
Pause
Fullscreen
Play rate slower
diff --git a/src/libse/Common/Settings.cs b/src/libse/Common/Settings.cs
index 8b6ea0ae5..f4e477759 100644
--- a/src/libse/Common/Settings.cs
+++ b/src/libse/Common/Settings.cs
@@ -2255,6 +2255,8 @@ $HorzAlign = Center
public string MainVideoPlayFromJustBefore { get; set; }
public string MainVideoPlayFromBeginning { get; set; }
public string MainVideoPlayPauseToggle { get; set; }
+ public string MainVideoPlay150Speed { get; set; }
+ public string MainVideoPlay200Speed { get; set; }
public string MainVideoShowHideVideo { get; set; }
public string MainVideoShowWaveform { get; set; }
public string MainVideoFoucsSetVideoPosition { get; set; }
@@ -8238,6 +8240,18 @@ $HorzAlign = Center
shortcuts.MainVideoPlayPauseToggle = subNode.InnerText;
}
+ subNode = node.SelectSingleNode("MainVideoPlay150Speed");
+ if (subNode != null)
+ {
+ shortcuts.MainVideoPlay150Speed = subNode.InnerText;
+ }
+
+ subNode = node.SelectSingleNode("MainVideoPlay200Speed");
+ if (subNode != null)
+ {
+ shortcuts.MainVideoPlay200Speed = subNode.InnerText;
+ }
+
subNode = node.SelectSingleNode("MainVideoShowHideVideo");
if (subNode != null)
{
@@ -10665,6 +10679,8 @@ $HorzAlign = Center
textWriter.WriteElementString("MainVideoPlayFromJustBefore", shortcuts.MainVideoPlayFromJustBefore);
textWriter.WriteElementString("MainVideoPlayFromBeginning", shortcuts.MainVideoPlayFromBeginning);
textWriter.WriteElementString("MainVideoPlayPauseToggle", shortcuts.MainVideoPlayPauseToggle);
+ textWriter.WriteElementString("MainVideoPlay150Speed", shortcuts.MainVideoPlay150Speed);
+ textWriter.WriteElementString("MainVideoPlay200Speed", shortcuts.MainVideoPlay200Speed);
textWriter.WriteElementString("MainVideoShowHideVideo", shortcuts.MainVideoShowHideVideo);
textWriter.WriteElementString("MainVideoShowWaveform", shortcuts.MainVideoShowWaveform);
textWriter.WriteElementString("MainVideoFoucsSetVideoPosition", shortcuts.MainVideoFoucsSetVideoPosition);
diff --git a/src/ui/Controls/VideoPlayerContainer.cs b/src/ui/Controls/VideoPlayerContainer.cs
index 35819ff96..25196acf2 100644
--- a/src/ui/Controls/VideoPlayerContainer.cs
+++ b/src/ui/Controls/VideoPlayerContainer.cs
@@ -85,6 +85,7 @@ namespace Nikse.SubtitleEdit.Controls
private bool _isMuted;
private double? _muteOldVolume;
+ public bool PlayedWithCustomeSpeed;
private readonly System.ComponentModel.ComponentResourceManager _resources;
public int ControlsHeight = 47;
private const int OriginalSubtitlesHeight = 57;
@@ -1759,6 +1760,11 @@ namespace Nikse.SubtitleEdit.Controls
_pictureBoxPlay.Visible = true;
_pictureBoxPlay.BringToFront();
RefreshProgressBar();
+
+ if (PlayedWithCustomeSpeed)
+ {
+ VideoPlayer.PlayRate = 1.0;
+ }
}
}
diff --git a/src/ui/Forms/Main.cs b/src/ui/Forms/Main.cs
index 8b8689243..19e59b236 100644
--- a/src/ui/Forms/Main.cs
+++ b/src/ui/Forms/Main.cs
@@ -16739,6 +16739,22 @@ namespace Nikse.SubtitleEdit.Forms
System.Threading.SynchronizationContext.Current.Post(TimeSpan.FromMilliseconds(1), () => mediaPlayer.TogglePlayPause());
}
}
+ else if (e.KeyData == _shortcuts.VideoPlay150Speed)
+ {
+ if (mediaPlayer.VideoPlayer != null)
+ {
+ SetPlayRateAndPlay(150);
+ e.SuppressKeyPress = true;
+ }
+ }
+ else if (e.KeyData == _shortcuts.VideoPlay200Speed)
+ {
+ if (mediaPlayer.VideoPlayer != null)
+ {
+ SetPlayRateAndPlay(200);
+ e.SuppressKeyPress = true;
+ }
+ }
else if (e.KeyData == _shortcuts.VideoPause)
{
if (mediaPlayer.VideoPlayer != null)
@@ -24434,7 +24450,7 @@ namespace Nikse.SubtitleEdit.Forms
var backColor = UiUtil.BackColor;
for (int i = 30; i <= 300; i += 10)
{
- toolStripSplitButtonPlayRate.DropDownItems.Add(new ToolStripMenuItem(i + "%", null, SetPlayRate) { Checked = i == 100, BackColor = backColor, ForeColor = foreColor });
+ toolStripSplitButtonPlayRate.DropDownItems.Add(new ToolStripMenuItem(i + "%", null, SetPlayRate, i.ToString()) { Checked = i == 100, BackColor = backColor, ForeColor = foreColor });
}
}
@@ -24446,12 +24462,18 @@ namespace Nikse.SubtitleEdit.Forms
}
}
+ private void SetPlayRateAndPlay(int playRate)
+ {
+ SetPlayRate(toolStripSplitButtonPlayRate.DropDownItems[playRate.ToString()], null, false, true);
+ mediaPlayer.Play();
+ }
+
private void SetPlayRate(object sender, EventArgs e)
{
SetPlayRate(sender, e, false);
}
- private void SetPlayRate(object sender, EventArgs e, bool skipStatusMessage)
+ private void SetPlayRate(object sender, EventArgs e, bool skipStatusMessage, bool playedWithCustomeSpeed = false)
{
if (!(sender is ToolStripMenuItem playRateDropDownItem) || mediaPlayer == null || mediaPlayer.VideoPlayer == null)
{
@@ -24463,19 +24485,23 @@ namespace Nikse.SubtitleEdit.Forms
item.Checked = false;
}
- playRateDropDownItem.Checked = true;
var percentText = playRateDropDownItem.Text.TrimEnd('%');
+ var factor = double.Parse(percentText) / 100.0;
if (!skipStatusMessage)
{
ShowStatus(string.Format(_language.SetPlayRateX, percentText));
}
- var factor = double.Parse(percentText) / 100.0;
- toolStripSplitButtonPlayRate.Image = Math.Abs(factor - 1) < 0.01 ? imageListPlayRate.Images[0] : imageListPlayRate.Images[1];
+ if (!playedWithCustomeSpeed)
+ {
+ playRateDropDownItem.Checked = true;
+ toolStripSplitButtonPlayRate.Image = Math.Abs(factor - 1) < 0.01 ? imageListPlayRate.Images[0] : imageListPlayRate.Images[1];
+ }
try
{
mediaPlayer.VideoPlayer.PlayRate = factor;
+ mediaPlayer.PlayedWithCustomeSpeed = playedWithCustomeSpeed;
}
catch
{
diff --git a/src/ui/Forms/Options/Settings.cs b/src/ui/Forms/Options/Settings.cs
index c2d8a699b..7c8bb15dc 100644
--- a/src/ui/Forms/Options/Settings.cs
+++ b/src/ui/Forms/Options/Settings.cs
@@ -1340,6 +1340,8 @@ namespace Nikse.SubtitleEdit.Forms.Options
AddNode(videoNode, LanguageSettings.Current.Main.Menu.Video.OpenVideo, nameof(Configuration.Settings.Shortcuts.MainVideoOpen), true);
AddNode(videoNode, LanguageSettings.Current.Main.Menu.Video.CloseVideo, nameof(Configuration.Settings.Shortcuts.MainVideoClose), true);
AddNode(videoNode, language.TogglePlayPause, nameof(Configuration.Settings.Shortcuts.MainVideoPlayPauseToggle));
+ AddNode(videoNode, language.Play150Speed, nameof(Configuration.Settings.Shortcuts.MainVideoPlay150Speed));
+ AddNode(videoNode, language.Play200Speed, nameof(Configuration.Settings.Shortcuts.MainVideoPlay200Speed));
AddNode(videoNode, language.Pause, nameof(Configuration.Settings.Shortcuts.MainVideoPause));
AddNode(videoNode, LanguageSettings.Current.Main.VideoControls.Stop, nameof(Configuration.Settings.Shortcuts.MainVideoStop));
AddNode(videoNode, LanguageSettings.Current.Main.VideoControls.PlayFromJustBeforeText, nameof(Configuration.Settings.Shortcuts.MainVideoPlayFromJustBefore));
diff --git a/src/ui/Logic/Language.cs b/src/ui/Logic/Language.cs
index 62e5e5902..837f7fe41 100644
--- a/src/ui/Logic/Language.cs
+++ b/src/ui/Logic/Language.cs
@@ -2788,6 +2788,8 @@ can edit in same subtitle file (collaboration)",
PlaySelectedLines = "Play selected lines",
Pause = "Pause",
TogglePlayPause = "Toggle play/pause",
+ Play150Speed = "Play video with 1.5x speed",
+ Play200Speed = "Play video with 2.0x speed",
Fullscreen = "Fullscreen",
PlayRateSlower = "Play rate slower",
PlayRateFaster = "Play rate faster",
diff --git a/src/ui/Logic/LanguageDeserializer.cs b/src/ui/Logic/LanguageDeserializer.cs
index 4ad87baae..789c0650e 100644
--- a/src/ui/Logic/LanguageDeserializer.cs
+++ b/src/ui/Logic/LanguageDeserializer.cs
@@ -6742,6 +6742,12 @@ namespace Nikse.SubtitleEdit.Logic
case "Settings/TogglePlayPause":
language.Settings.TogglePlayPause = reader.Value;
break;
+ case "Settings/Play150Speed":
+ language.Settings.Play150Speed = reader.Value;
+ break;
+ case "Settings/Play200Speed":
+ language.Settings.Play200Speed = reader.Value;
+ break;
case "Settings/Pause":
language.Settings.Pause = reader.Value;
break;
diff --git a/src/ui/Logic/LanguageStructure.cs b/src/ui/Logic/LanguageStructure.cs
index a91017b2b..881dc5223 100644
--- a/src/ui/Logic/LanguageStructure.cs
+++ b/src/ui/Logic/LanguageStructure.cs
@@ -2641,6 +2641,8 @@
public string WaveformGoToNextChapter { get; set; }
public string WaveformSelectNextSubtitle { get; set; }
public string TogglePlayPause { get; set; }
+ public string Play150Speed { get; set; }
+ public string Play200Speed { get; set; }
public string Pause { get; set; }
public string Fullscreen { get; set; }
public string PlayRateSlower { get; set; }
diff --git a/src/ui/Logic/MainShortcuts.cs b/src/ui/Logic/MainShortcuts.cs
index 77aa9702c..3a267e41a 100644
--- a/src/ui/Logic/MainShortcuts.cs
+++ b/src/ui/Logic/MainShortcuts.cs
@@ -39,6 +39,8 @@ namespace Nikse.SubtitleEdit.Logic
public Keys VideoPause { get; set; }
public Keys VideoStop { get; set; }
public Keys VideoPlayPauseToggle { get; set; }
+ public Keys VideoPlay150Speed { get; set; }
+ public Keys VideoPlay200Speed { get; set; }
public Keys MainVideoPlayFromJustBefore { get; set; }
public Keys MainVideoPlayFromBeginning { get; set; }
public Keys Video1FrameLeft { get; set; }
@@ -270,6 +272,8 @@ namespace Nikse.SubtitleEdit.Logic
MainVideoFocusSetVideoPosition = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoFoucsSetVideoPosition);
ToggleVideoDockUndock = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoToggleVideoControls);
VideoPlayPauseToggle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoPlayPauseToggle);
+ VideoPlay150Speed = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoPlay150Speed);
+ VideoPlay200Speed = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoPlay200Speed);
Video1FrameLeft = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideo1FrameLeft);
Video1FrameRight = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideo1FrameRight);
Video1FrameLeftWithPlay = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideo1FrameLeftWithPlay);