winforms AxWindows媒体播放器:在最后一帧暂停

k5ifujac  于 2022-11-16  发布在  Windows
关注(0)|答案(3)|浏览(384)

我正在Winforms C#应用程序中使用AxWindowsMediaPlayer控件,并且希望将播放器设置为在视频播放完成时在最后一帧暂停。我已经处理了视频播放完成的事实,以便在播放器上显示另一个具有不同内容的控件,但我希望避免在中间显示空白帧。
有没有可能配置播放器在最后一帧暂停?或者有没有一个我可以处理的事件来设置视频在最后一帧或最后几毫秒暂停?
另外,PositionChange事件似乎只有在用户或代码中设置位置时才会引发,所以我不能使用它。MarkerHit事件似乎很有前途,但我找不到任何方法在视频中设置标记,因此也不起作用。

2cmtqfgy

2cmtqfgy1#

MediaPlayer中有一个特殊事件,您可以在其中跟踪播放状态更改。此事件为PlayStateChange。只需订阅此事件,您就可以执行以下操作:

private void MediaPlayer_PlayStateChange( object sender, _WMPOCXEvents_PlayStateChangeEvent e )
    {
        switch( e.newState )
        {
        case 0:    // Undefined
            break;
        case 1:    // Stopped
            // keep last frame
            View.MediaPlayer.Ctlcontrols.currentPosition = View.MediaPlayer.currentMedia.duration - .001;
            View.MediaPlayer.Ctlcontrols.play();
            View.MediaPlayer.Ctlcontrols.pause();
            break;
        case 2:    // Paused
            break;
        case 3:    // Playing
            break;
        case 4:    // ScanForward
            break;
        case 5:    // ScanReverse
            break;
        case 6:    // Buffering
            break;
        case 7:    // Waiting
            break;
        case 8:    // MediaEnded
            break;
        case 9:    // Transitioning
            break;
        case 10:   // Ready
            break;
        case 11:   // Reconnecting
            break;
        case 12:   // Last
            break;
        }
    }
flmtquvp

flmtquvp2#

这并不像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;
        }                           
    }
41zrol4v

41zrol4v3#

你好
就这么简单。
首先,您需要添加一个计时器。现在处理Timer1_Tick事件:

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

"就是这样"

**PS:**一定要启动定时器。

娜西米

相关问题