日期:2014-05-16  浏览次数:21774 次

WPF下如何直接播放YUV视频流
现在的做法是把YUV转为RGB后,再把RGB转BitmapSource,然后加载到Image.Source里面,但是效率低;
YUV转为RGB、再把RGB流转BitmapSource这个过程消耗了大量CPU。

silverlight就可以直接播放yu12的流,但不知道怎么直接在WPF里播放YUV,不要第三方组件传句柄的方式,wpf的控件无句柄,如果用了WindowsFormsHost加载其他控件,界面就会被WindowsFormsHost置顶,无法在视频上做叠加、菜单等其他操作了。

YUV转RGB用的是C++的类库,就不贴代码了,转换出来的是Rgb24的格式,下面是RBG转BitmapSource的代码,都是一帧数据的转。

private BitmapSource ByteArrayToBitmapImage(byte[] byteArray)
        {
            BitmapSource bmp = null;
            bmp = BitmapImage.Create(704, 576, 96, 96, PixelFormats.Rgb24, MainWindow.myPalette, byteArray, 704 * PixelFormats.Rgb24.BitsPerPixel / 8);
            return bmp;
        }


网上有些资料说直接用directshow来直接渲染,不知道WPF中怎么用directshown来播放视频。
------解决方案--------------------
我觉得google比这里求助来结果更快。去搜搜英文资料应该有类似的问题。
------解决方案--------------------
DirectShow播放的话依然是要基于窗体句柄的,所以依然无法在视频窗口上叠加其他WPF的东西,不过也许可以变通一下,另外做一个窗体,在上面放WPF控件,这样就可以把它盖到视频窗口上面去了,但是背景要透明估计也比较难
------解决方案--------------------
最近正在研究这个。可以参考一下网上VideoRendererElement这个开源的东西,是WPF结合DirectShow做的。