2011-09-23 61 views
0

我的Windows窗体项目中有一个Windows媒体播放器COM,可以很好地播放和打开视频。但是,我希望能够抓取已加载视频的第一帧,以便我的程序用户可以预览视频(并且理想情况下可以识别另一个视频)。如何更新Windows Media Player COM的框架?

如何更新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(),视频将不会开始播放)。如果我不得不猜测,我会说这是因为某些线程操作会调用播放,继续调用暂停,调用暂停,然后,最终播放结束,视频开始 - 但由于.pause在.play之前就解决了,最终的效果是.pause最终没有被注意到。首先,除了.play()之外,还有其他方法吗? 。暂停();为AxWindowsMediaPlayer对象获取视频的预览图像?如果没有,我怎样才能确保我的.pause()不会被忽略?

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

回答

2

虽然Windows媒体播放器的COM可能不正式支持这样的功能,它很容易“假”这一点。如果您使用CtlControls2,则可以访问内置的“步骤(1)”功能,该功能只会执行一帧。

我发现,如果你调用步骤(1)调用暂停(),搜索上的TrackBar也将更新后的视频。

这不是很漂亮,但它的工作原理!

1

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

祝你好运在你的追求。

Hanlet

0

这是一个小技巧来解决常见步骤(-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);