none
已解决在WPF里播放视频问题啦,高清视频连续挺过了60h啦,特此专门来回顾并结贴,再加感谢!!! RRS feed

  • 问题

  • 首先,要感谢一下Bob Bao,有贴必回,给我了不少建议。另外,还有shixin也得谢谢你!

    今天特地来结贴,但发现贴子已自动给结了,嘿嘿,不好意思啊。这些天一直在测试!!!

    围绕一个视频播放,纠结了近一个多月啊!主要原因还是自己对WPF不够了解吧,特别是对WPF与winform之间的一些互操作类型,了解不够深。唉,没有办法,也是因公司要求,一个多月之前才刚开始接触WPF,真没有想到会因这个视频问题卡了这么久。

    在刚接到公司要求在WPF里做视频与图片切换播放之时,对于播放视频这一块,先用了WPF里的MediaElement以及MediaPlayer等控件,结果发现在播放高清视频时,性能的短板就表现得相当明显(windows XP 平台)。

    所以就立马放弃了WPF自带的视频控件,转向了DirectShow。但在用DirectShow时,发现WPF控件里都没有Handle,视频加在WindowsFormHost在里面,会出现AirSpace问题,然后又在Google里找,找到了AvcapWPF,VideoRendererElement,wpfmediakit等控件,也并不理想。之前也发贴求助过,但没有得到好的解决方案。

    在此,又不得不放弃DirectShow了,转向了第三方控件axWindowsMediaPlayer,但不够稳定,时间播放久了,会在设置uiMode里出问题,也发贴求助过,但也没有得到好的解决方案。shixin仁兄最后给我的建议是,代码里不要再new WMP控件了,或去掉uiMode试试。我只试过去掉uiMode,发现也不理想,它不报错,并且中途会无缘无故结束掉。

    结果放弃axWindowsMediaPlayer,换其它控件,Qvod,PPStream,暴风影音,也都试过。发现毕竟人家是为自己做播放器的,提供的接口很有限,都不好用,稳定性就更不用谈。

    最后,我还是回到了起初的DirectShow,在一次尝试自己写个ocx控件时,把DirectShow做到winform控件库里,然后再引用到WPF里引用,结果发现还真的可以呢。。。嘿嘿,最后就按这种方法做下来了,现在很稳定,720p视频再加图片连续跑了60小时,都相当正常。不过,1080P跑不流畅了,这只跟设备有关,与我程序无关。

    唉,这弯子真的绕得有点大了,回到了一个月以前的DirectShow,原因归根到底还是自己没有真正领会到WPF里的互操作类型,在此表示忏悔。

    哦,对了,还有一个小问题哦。在放高清视频时,如果在视频之上,再弹出一个窗体,窗体出闪闪,不知道有没有好的解决方案哦。目前正在找方法。。。不过,播放问题解决了,其它问题都好办。


    • 已编辑 lovsan 2011年12月26日 7:43
    2011年12月26日 7:31

答案

  • 不客气啦,shixin 的回答很专业,他的经验很丰富。以后有什么问题欢迎到MSDN论坛,这里有很多板块多是由我们负责打理的。如果你觉得信息量不够多。你也可以到我们的MSDN英文论坛,那里MVP 国外大牛较多,可以近距离的和一些大师们交流。http://social.msdn.microsoft.com/Forums/en-us/categories/  :)

    窗体一闪闪? 这个窗体是你的程序的吗? 老样子,我们先看看这个窗体的基本属性,我建议你试着开启 AllowsTransparency="True" . 或者设计一个所谓的 Layered Window 再试试看。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 lovsan 2011年12月29日 5:47
    2011年12月27日 3:42
    版主
  • DX和GDI原理不同,DGI刷新速率远低于DX的速率,据我了解 GDI最好情况下也就 15帧每秒,所以在DX上方的话,DX基本上能有50-60帧每秒,而且DX和DGI的控制区域不能混合重叠,所以他们各自负责自己的重绘刷新,DX一秒要将近50-60次,但这其中GDI在这个区域上最多也就进行了15次,所以我们会觉得闪动。

    应该是这个道理。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 lovsan 2011年12月29日 5:47
    2011年12月29日 2:56
    版主

全部回复

  • 不客气啦,shixin 的回答很专业,他的经验很丰富。以后有什么问题欢迎到MSDN论坛,这里有很多板块多是由我们负责打理的。如果你觉得信息量不够多。你也可以到我们的MSDN英文论坛,那里MVP 国外大牛较多,可以近距离的和一些大师们交流。http://social.msdn.microsoft.com/Forums/en-us/categories/  :)

    窗体一闪闪? 这个窗体是你的程序的吗? 老样子,我们先看看这个窗体的基本属性,我建议你试着开启 AllowsTransparency="True" . 或者设计一个所谓的 Layered Window 再试试看。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 lovsan 2011年12月29日 5:47
    2011年12月27日 3:42
    版主
  • 窗体闪,我感觉还是与系统本身绘图有关吧

    我的视频嵌套在WindowsFormHost里播放,包括视频在内,这些都应该属于GDI绘图吧,而浮在GDI上面的是一个WPF window窗体,这个属于DirectX绘图吧。也许是这种原因吧。

    听网上有人说,window系统是先GDI绘图然后再DirectX绘图,会不会在播放视频的时候,在呈现每一帧的时候,都会因此而闪一下啊。

    之前在用axWindowsMediaPlayer等第三方控件时,与现在所用的DirectShow做的一样,浮在上面的window窗体会闪。

    • 已编辑 lovsan 2011年12月28日 5:31
    2011年12月28日 5:05
  • DX和GDI原理不同,DGI刷新速率远低于DX的速率,据我了解 GDI最好情况下也就 15帧每秒,所以在DX上方的话,DX基本上能有50-60帧每秒,而且DX和DGI的控制区域不能混合重叠,所以他们各自负责自己的重绘刷新,DX一秒要将近50-60次,但这其中GDI在这个区域上最多也就进行了15次,所以我们会觉得闪动。

    应该是这个道理。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 lovsan 2011年12月29日 5:47
    2011年12月29日 2:56
    版主
  • 嗯。wmv,rmvb格式不闪,先暂时用这两种格式

    2011年12月29日 5:48
  • 每次来MSDN都有收获
    Hero
    2011年12月31日 2:10
  • 窗体闪,我感觉还是与系统本身绘图有关吧

    我的视频嵌套在WindowsFormHost里播放,包括视频在内,这些都应该属于GDI绘图吧,而浮在GDI上面的是一个WPF window窗体,这个属于DirectX绘图吧。也许是这种原因吧。

    听网上有人说,window系统是先GDI绘图然后再DirectX绘图,会不会在播放视频的时候,在呈现每一帧的时候,都会因此而闪一下啊。

    之前在用axWindowsMediaPlayer等第三方控件时,与现在所用的DirectShow做的一样,浮在上面的window窗体会闪。

    嗯,我也遇到这个问题,而且是在XP下有这个问题,在win7下却是正常的,试了很多方法,没有解决,楼主解决了吗?
    2012年1月29日 9:06
  • lovsan你好,看到你的这篇帖子我小激动了一下,因为我最近也被这个问题困扰,我是利用Media Foundation实现在WPF窗口播放视频的功能,但是目前只能播放声音,视频画面显示不出来,请您帮助,谢谢!期待回复
    2013年2月28日 1:36
  • lovsan:

    看到我的问题可否帮忙解决一下呢,谢谢了!

    2013年3月5日 7:38
  • 你好,请问最后的解决办法是将DX做成OCX控件,还是一般WinForm控件,再引入到WPF中?
    2015年4月15日 15:51