我的Windows窗体项目中有一个Windows媒体播放器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();
适用于一般的情况,因为我测试了一个单独的按钮,在视频完成加载后调用了这两个方法,它按预期工作了)
答案 0 :(得分:2)
你不能用这个COM做很多事情。但是Follow this link你会发现一个可以帮助你从视频文件中提取图像的类。您可以简单地提取图像并将其放在视频的顶部或旁边。这是针对您的要求的简单解决方法。如果不满意,我强烈建议不要使用这个COM,并使用其他一些开源视频播放器/插件。有很多真正好的,但我可以推荐VLC Plugin,或尝试寻找另一个。
祝你好运。
Hanlet
答案 1 :(得分:2)
虽然Windows Media Player Com可能不会正式支持这样的功能,但很容易“伪造”这个。如果使用CtlControls2,则可以访问内置的“step(1)”函数,该函数只执行一帧。
我发现如果您在致电 pause()后致电步骤(1),则在轨道栏上搜索也会更新视频。
它不漂亮,但它有效!
答案 2 :(得分:1)
这是解决共同步骤(-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);