如何更新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();
在一般情况下工作,因为我测试了一个单独的按钮,在视频完成加载后调用这两个方法,并且它按预期工作)
这个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);