由此,只要是使用DirectShow的视频播放就可以借助VMR9在WPF上完美显示。但很多时候,DirectShow不能解决所有问题。例如在做交互式视频优化处理或是视频叠加的时候, 采用固定滤镜流水线的DirectShow很难满足要求。有的时候还是需要便捷的直接渲染的方式。
由VMR9的例子我们可以看出,产生出一个D3D9Surface并在上面渲染是其中的关键。那么剩下的问题就是如何把YUV数据渲染到D3D9Surface。
D3D没有直接支持YUV图像格式。因此需要我们想办法让D3D能够渲染YUV数据。在用C#改写的过程当中,我突然发现D3D已经提供了更简单的方法帮助我们实现YUV到RGB颜色空间的转换,而且是通过显卡硬件直接支持。效率相当的高。主要原理就是借助D3DDevice的StrentchRectangle方法。
public void StretchRectangle( Surface sourceSurface, Rectangle sourceRectangle, Surface destSurface, Rectangle destRectangle, TextureFilter filter );
StrentchRectangle方法的主要功能是将一个Surface上的某个区域的内容拷贝到另一个Surface的指定区域中。在Copy的过程当中,只要是显卡直接支持的格式,如YV12,YUY2等等, 都会自动的进行D3D PixelFormat的转换!因此,我们只需要创建一个指定好PixelFormat的D3D OffscreenPlainSurface, 把原始数据填充进去,调用StrentchRectangle向目标Surface拷贝,我们就得到了想要的Surface。剩下的事情就交给D3DImage了。下面是例子代码的核心部分
public void Render(IntPtr imgBuffer)
{
lock (this.renderLock)
{
// 将图像数据填充进offscreen surface
this.FillBuffer(imgBuffer);
// 调用StrentchRectangle把原始图像数据Copy到TextureSurface中
this.StretchSurface();
// 执行渲染操作
this.CreateScene();
}
// 通知D3DImage刷新图像
this.InvalidateImage();
}
以上所述是小编给大家介绍的WPF下YUV播放的D3D解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对易采站长站网站的支持!








