none
各位大虾们,请教一个关于WPF用DirectShow做视频播放问题【版主高手在哪里】大家给下意见啊,卡了好多天了,谢谢了!!! RRS feed

  • 问题

  • 请教一个关于WPF用DirectShow做视频播放问题,由于考虑到性能问题,放弃了MediaElement控件,选择用DirectShow做。

    在winform程序里,有每个控件都有handle,用DirectShow做视频播放,比较好做,直接put_Owner指定到handle就可以让视频在指定的控件窗口里播放。
    但是在WPF里,只有window才有handle,而控件是没有的,用DirectShow做时,不能直接指定window的handle,否视频会隐藏掉。

    我在网上找了不少方面,最终还是因为不理想与搞不定而以失败OVER:
    我尝试过用windowsFormHost嵌套Form控件做,但视频总是以ActiveMoive Window方式嵌到控件里面,控制不了大小,另外还存在一个不能半透明的缺点。
    我也在codeplex里找过AvcapWPF,VideoRendererElement,wpfmediakit貌似都不理想,这些都比较适调用摄像头视频播放。但以上几个控件都是用DirectShow做为播放核心,但苦于自己DirectShow基础不是扎实,所以看不明白,那几个控件是如何将DirectShow的视频Render(呈现)在WPF窗体的控件里的。关键是这个原理不太明白,在此请教做过DirectShow方面的高手。
    如果这个方式难行通,不知道还有没有其它性能好点的视频播放呢?

    2011年11月23日 15:30

答案

  • 你好 lovsan,

    如果我们在WPF中加入了WindowsFormHost,那么,WindowsFormHost是有它的Handle的。只是受限于WPF的AirSpace问题,WindowsFormHost中的组件无法做到你所要的大小布局的控制和半透明等效果。而且AirSpace本身会约束所有非WPF控制的控件在WPF中呈现:http://msdn.microsoft.com/zh-cn/library/aa970688.aspx

    还有你提到几个项目几乎已经把DirectShow在WPF中整合做到极致了,如果你要看看还有没有其他的,我想你可以考虑看看 VLC 的ActiceX组件:http://wiki.videolan.org/ActiveX

    还有,HTML5已经实现了<Video/>标签,你也可以考虑使用这种简单的方式通过HTML5页面也播放,也省得深入地去实现比较底层的视频播放了。

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月24日 3:21
    版主
  • 目前还没有VLC在WPF中的成功例子,不过即使成功,因为他还是一个ActiveX,还是会受到 AirSpace约束的。

    至于XP下关于HTML5的问题,我觉得不大,如果客户那边却是要考虑到IE 6或者7,8上不支持HTML5的话,导致我们的WebBrowser无法支持HTML5,我可以推荐你使用一个基于 Google 的Chromium项目的 WebBrowser控件,而且目前来看他没有AirSpace影响:http://wpfchromium.codeplex.com/   你设计好你的HTML5页面,然后用它呈现应该就没问题了。 他的相关Blog http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 lovsan 2011年12月8日 6:46
    2011年11月24日 5:44
    版主
  • DirectShow可以通过DirectX  D3DImage去呈现,还是有AirSpace问题,具体你可以从这里入手:http://msdn.microsoft.com/zh-cn/library/cc656710.aspx

    还有,我使用过 Chromium项目的 WebBrowser控件,不过不是编译他的源码,而是直接使用它的库,没有问题。我想知道你是否基于.Net 4开发的?


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月24日 7:53
    版主

全部回复

  • 你好 lovsan,

    如果我们在WPF中加入了WindowsFormHost,那么,WindowsFormHost是有它的Handle的。只是受限于WPF的AirSpace问题,WindowsFormHost中的组件无法做到你所要的大小布局的控制和半透明等效果。而且AirSpace本身会约束所有非WPF控制的控件在WPF中呈现:http://msdn.microsoft.com/zh-cn/library/aa970688.aspx

    还有你提到几个项目几乎已经把DirectShow在WPF中整合做到极致了,如果你要看看还有没有其他的,我想你可以考虑看看 VLC 的ActiceX组件:http://wiki.videolan.org/ActiveX

    还有,HTML5已经实现了<Video/>标签,你也可以考虑使用这种简单的方式通过HTML5页面也播放,也省得深入地去实现比较底层的视频播放了。

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月24日 3:21
    版主
  • 感谢Bob Bao的回复,非常谢谢!

    找好几些天,都没有找到一个用DirectShow在WPF里做播放器。DirectShow在WPF里做摄像头视频播放还有好几个,但没法改成使之直接播放视频文件。

    现在一个项目,涉及到播放高清晰视频,所以在WPF里用mediaPlayer+DrawingVisual或直接用mediaElement来播放,都存在卡机,不流畅问题。用DirectShow播放都比较正常,但实在是不好整合啊。如果用WindowsFormHost做,又存在AirSpace问题,真郁闷!

    还有WPF程序是在WinXP上运行,Html5貌似不行吧!

    VLC 的ActiceX组件整合到WPF里,好整合吗,网上有没有成功案例呀?

    2011年11月24日 5:24
  • 目前还没有VLC在WPF中的成功例子,不过即使成功,因为他还是一个ActiveX,还是会受到 AirSpace约束的。

    至于XP下关于HTML5的问题,我觉得不大,如果客户那边却是要考虑到IE 6或者7,8上不支持HTML5的话,导致我们的WebBrowser无法支持HTML5,我可以推荐你使用一个基于 Google 的Chromium项目的 WebBrowser控件,而且目前来看他没有AirSpace影响:http://wpfchromium.codeplex.com/   你设计好你的HTML5页面,然后用它呈现应该就没问题了。 他的相关Blog http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 lovsan 2011年12月8日 6:46
    2011年11月24日 5:44
    版主
  • 谢谢Bob Bao,感谢你!

    Chromium项目的 WebBrowser控件整个源项目,我都下载下来,但编译不通过,特别那个C++项目库!理论上用HTML5来播放,应该是可以的,但实现起来,不知道好不好控制视频大小,包括截图等。

    现在感觉还是DirectShow比较理想点,但就是不好实现,不知道如何呈现在WPF里。(:

    唉……

    2011年11月24日 6:52
  • DirectShow可以通过DirectX  D3DImage去呈现,还是有AirSpace问题,具体你可以从这里入手:http://msdn.microsoft.com/zh-cn/library/cc656710.aspx

    还有,我使用过 Chromium项目的 WebBrowser控件,不过不是编译他的源码,而是直接使用它的库,没有问题。我想知道你是否基于.Net 4开发的?


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月24日 7:53
    版主
  • HTML5 实现其实是可以通过HTML来先实现一个播放器,如优库这种等,然后直接嵌套。是可以实现截图,大小控制 甚至还有字幕支持。
    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月24日 7:54
    版主
  • 我是用.NET 4开发的,我按照所说的,在codeplex里下载了Chromium项目的 WebBrowser控件的整个工程文件。但是C#源代码里面缺少Cjc.AwesomiumWrapper,运行不起来。而那个Cjc.AwesomiumWrapper是一个C++库,未能编译成dll文件,所以引用不了。不知道你直接使用它的库,是哪里下载来的!

    听你说在WPF里嵌入WebBrowser控件用HTML5实现播放,还能截图,控制大小,我又看到了希望了!

    Bob Bao谢谢你了,真的很感激你!

     

    2011年11月24日 9:04
  • 推荐你看下 HTML5 Media这本书。
    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2011年11月24日 9:15
    版主