3

我在 Winforms C# 应用程序中使用 AxWindowsMediaPlayer 控件,我想将播放器设置为在视频播放完毕后在最后一帧暂停。我已经处理了视频已完成以在播放器上显示具有不同内容的另一个控件的事实,但我想避免出现在两者之间的空白帧。

是否可以将播放器配置为在最后一帧暂停?或者我可以处理一个事件来将视频设置为在最后一帧或最后几毫秒暂停?

PS。PositionChange 事件似乎仅在用户或代码中设置位置时引发,因此我无法使用它。MarkerHit 事件似乎很有希望,但我找不到任何方法在视频中设置标记,所以这也不起作用。

4

2 回答 2

1

这并不像 Nadhmi (@user5330265) 所说的那么简单。视频可能会在计时器滴答之间完成播放并重置为空白帧,在这种情况下,永远不会执行暂停。

我发现了以下作品,代价是错过了视频的最后一个 iInterval 毫秒。tmrVideo 计时器间隔设置为 1 毫秒。在我的系统上,它似乎每 15 毫秒运行一次,但诊断会减慢它的速度。它似乎并没有增加整体 CPU 负载。我为 iInterval 使用 250 的值 - currentPosition 似乎永远不会达到持续时间。较小的值意味着更少的视频丢失,但出现空白帧的机会更大。

加载视频时 currentPosition 为零,这就是需要将测试添加到条件中的原因。

tmrVideo 需要在每个 axWindowsMediaPlayer1.Ctlcontrols.play() 命令之后启用。

private void tmrVideo_Tick(object sender, EventArgs e)
    {
        if ((axWindowsMediaPlayer1.currentMedia.duration - axWindowsMediaPlayer1.Ctlcontrols.currentPosition)*1000 < 
            iInterval) && 
            axWindowsMediaPlayer1.Ctlcontrols.currentPosition!= 0)
        {
            axWindowsMediaPlayer1.Ctlcontrols.pause();
            tmrVideo.Enabled = false;
        }                           
    }
于 2019-11-01T00:33:03.843 回答
-1

你好

就这么简单。

首先,您需要添加一个计时器。现在处理 Timer1_Tick 事件:

if (AxWindowsMediaPlayer1.Ctlcontrols.currentPosition == AxWindowsMediaPlayer1.currentMedia.duration) {
    AxWindowsMediaPlayer1.Ctlcontrols.pause();
}

就是这样

PS:一定要启动定时器。

纳德米。

于 2015-11-04T20:47:14.140 回答