1

我编写了一个 PixelShader 编译器/测试器,它可以在使用 DirectShow.Net + VMR9 播放的图像或视频源上实时工作。

一切都很好,直到我决定将它作为一个真正的视频播放器试一试,并开始调整它的每一点以使其正常工作(标题等)。

然后我发现在带有 ATI gpus 的 Windows7 上,视频非常像素化(插值很差)。解决方案是使用 EVR。我做到了。除了背景闪烁和调整大小缓慢的一些小故障之外,我将尝试使用自定义演示器解决它,这一切看起来都不错。

但...

我失去了对输出视频应用像素着色的能力,因为 EVR FilterConfig 接口上没有 SetImageCompositor 方法。

这是 EVR 界面:

[SuppressUnmanagedCodeSecurity]
[Guid("83E91E85-82C1-4ea7-801D-85DC50B75086")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IEVRFilterConfig
{
    void GetNumberOfStreams(out int pdwMaxStreams);
    void SetNumberOfStreams(int dwMaxStreams);
}

这是 VMR9 接口:

[Guid("5a804648-4f66-4867-9c43-4f5c822cf1b8")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[SuppressUnmanagedCodeSecurity]
public interface IVMRFilterConfig9
{
    int GetNumberOfStreams(out int pdwMaxStreams);
    int GetRenderingMode(out VMR9Mode Mode);
    int GetRenderingPrefs(out VMR9RenderPrefs pdwRenderFlags);
    int SetImageCompositor(IVMRImageCompositor9 lpVMRImgCompositor);
    int SetNumberOfStreams(int dwMaxStreams);
    int SetRenderingMode(VMR9Mode Mode);
    int SetRenderingPrefs(VMR9RenderPrefs dwRenderFlags);
}

我一直在使用这种方法和自定义图像合成器来应用像素着色器:

    IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)vmr9;
    // frameManager is my custom class implementing IVMRImageCompositor9
    hr = filterConfig.SetImageCompositor(frameManager);
    DsError.ThrowExceptionForHR(hr);

我现在不可以...

使用:VS2010、C#、DirectShow.NET、Mediafoundation.NET、托管 DX9。

这个问题的解决方案是什么?有关如何使用 EVR 执行此操作的任何指南?

非常感谢你!

4

1 回答 1

4

由于没有人提出建议,我挖掘了一下,并认为我已经找到了解决方案:

http://msdn.microsoft.com/en-us/library/bb530107(v=vs.85).aspx

这现在应该在自定义演示者中完成......

于 2011-04-08T19:40:25.150 回答