【问题标题】:AxWindowsMediaPlayer : pause on last frameAxWindowsMediaPlayer:在最后一帧暂停
【发布时间】:2019-11-01 08:39:33
【问题描述】:

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

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

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

【问题讨论】:

  • 有没有人找到解决方法?我面临着完全相同的问题

标签: c# winforms axwindowsmediaplayer


【解决方案1】:

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

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

在加载视频时,currentPosition 为零,这就是为什么需要将测试添加到条件中。

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

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;
        }                           
    }

【讨论】:

【解决方案2】:

就这么简单。

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

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

就是这样

PS:请务必启动计时器。

纳德米。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2012-12-18
    • 2021-01-07
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多