如何更新Windows Media playercom的框架?

本文关键字:playercom Media 框架 Windows 何更新 更新 | 更新日期: 2023-09-27 18:09:20

我有一个windows媒体播放器COM在我的windows窗体项目中播放和打开视频令人钦佩。但是,我希望能够抓取加载视频的第一帧,以便我的程序用户可以预览视频(并且,理想情况下,从另一个视频中识别一个视频)。

如何更新windows媒体播放器对象显示的帧?

我已经尝试在我的openFileDialog事件响应结束时使用以下代码:

private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
{
    Text = openFileDialog1.SafeFileName + " - MPlayer 2.0";
    //mediaPlayer1.openPlayer(openFileDialog1.FileName);
    mediaPlayer1.URL = openFileDialog1.FileName;
    //hopefully, this will load the first frame.
    mediaPlayer1.Ctlcontrols.play();
    mediaPlayer1.Ctlcontrols.pause();           
}

然而,当我运行这个时,暂停命令被忽略(视频加载的自动播放被关闭,所以视频不会在不调用.play()的情况下开始播放)。如果我不得不猜测,我会说这是因为一些线程操作调用播放,移动到调用暂停,调用暂停,然后,最后,播放解决,视频开始-但是因为。暂停在。播放之前解决,净效果是。暂停最终被忽略。

首先,除了。play()之外,还有其他方法吗?.pause ();为AxWindowsMediaPlayer对象抓取视频的预览图像?如果没有,我如何确保我的。pause()不会被忽略?

(我知道.play(); .pause();一般情况下工作,因为我测试了一个单独的按钮,在视频完成加载后调用这两个方法,并且它按预期工作)

如何更新Windows Media playercom的框架?

这个COM不能做很多事情。然而,按照这个链接,你会发现一个类,将帮助您提取图像从视频文件。你可以简单地提取图像,把它放在视频的顶部,或者旁边。这是满足您需求的一个简单的解决方法。如果对它不满意,我强烈建议不要使用这个COM,而是使用其他一些开源视频播放器/插件。有很多真正的好插件,但我可以推荐VLC插件,或者试着找另一个。

祝你好运。

Hanlet

虽然Windows Media playercom可能没有官方支持这样的功能,但很容易"伪造"这一点。如果使用CtlControls2,则可以访问内置的"step(1)"函数,该函数只执行一帧。

我发现,如果在调用pause()后调用step(1),在trackbar上搜索也会更新视频。

它不漂亮,但它有效!

这是一个解决常见步骤(-1)不工作问题的小技巧。

IWMPControls2 Ctlcontrols2 = (IWMPControls2)WindowsMediaPlayer.Ctlcontrols;
double frameRate = WindowsMediaPlayer.network.encodedFrameRate;
Console.WriteLine("FRAMERATE: " + frameRate); //Debug
double step = 1.0 / frameRate;
Console.WriteLine("STEP: " + step); //Debug
WindowsMediaPlayer.Ctlcontrols.currentPosition -= step; //Go backwards
WindowsMediaPlayer.Ctlcontrols.pause();
Ctlcontrols2.step(1);