小背景故事:
我的一个朋友和我正在尝试制作街机游戏模拟器。
我们有线框'已经设置(资产加载,游戏状态等),但我们完全停留在视频渲染上。
Example(你在背景中看到的钟摆/时钟的东西是一个WMV3无损视频,在后台用前景中的UI渲染这个是我们想要实现的。
我已经尝试使用除SharpDX的媒体基础之外的库(AForge,libvlc),但都没有产生正确的结果(AForge没有寻找功能,libVLC也无法处理视频比特率我可以在libvlc中打开硬件加速。)
TL; DR 尝试渲染&使用SharpDX.MediaFoundation解码高比特率720p WMV3视频,利用硬件加速解码/渲染(仅限D3D9 )
为什么选择D3D9?:Windows XP - 兼容Windows 10,我们并不急于将DX11.2与MediaEngineEx一起使用,因为这将不再支持Windows XP - Windows 7。 / p>
SharpDX MediaFoundation Docs(自己看看,要么我太愚蠢了,要么我的理解程度太低,无法理解)
我现在有什么:
渲染循环:
Lib.Render += (RenderForm e) =>
{
GameStateManager.Draw();
};
此事件由以下人员调用:
public static void Run(float drawRate = 60.0f, float updateRate = 60.0f)
{
DrawRate = drawRate;
UpdateRate = updateRate;
IsRunning = true;
Begin = DateTime.Now;
RenderLoop.Run(Window, () =>
{
Lib.BeginUpdate();
OnUpdate();
if (!IsResizing)
OnRender();
Lib.EndUpdate();
});
}
的OnRender
这个函数构成了一个用于简化SharpDX.Direct3D9调用的小型库的一部分,它初始化如下:
public static DX9Device Initialise(int width = 1280, int height = 720)
{
Window = new RenderForm("Test");
Window.ClientSize = new Size(width, height);
Window.AllowUserResizing = false;
TextureCache = new Dictionary<string, Texture>();
DI = new DirectInput();
D3D = new Direct3D();
Device = new DX9Device(D3D, 0, DX9DeviceType.Hardware, Window.Handle, CreateFlags.HardwareVertexProcessing, new PresentParameters(Window.ClientSize.Width, Window.ClientSize.Height));
KeyboardDevice = new Keyboard(DI);
Window.ResizeBegin += Window_ResizeBegin;
Window.Resize += Window_Resize;
Window.ResizeEnd += Window_ResizeEnd;
Foreground = new SharpDX.Direct3D9.Sprite(Device);
Background = new SharpDX.Direct3D9.Sprite(Device);
return Device;
}
您可能需要更多信息来帮助我解决此问题,请询问。
编辑:目标框架是.NET 4客户端配置文件
编辑:到目前为止我已经尝试了这个,但它在行上提供了NullReferenceException&#34; HDDevice dxvaDev_ = ...&#34;:
public static void Initialise(DX9Device dev)
{
ContentDescription cd = new ContentDescription();
Rational fps = new Rational();
fps.Denominator = 1;
fps.Numerator = 30;
cd.InputFrameFormat = FrameFormat.Progressive;
cd.InputFrameRate = fps;
cd.InputWidth = 1280;
cd.InputHeight = 780;
cd.OutputFrameRate = fps;
cd.OutputWidth = 1280;
cd.OutputHeight = 720;
HDDevice dxvaDev_ = new HDDevice(dev, cd, DeviceUsage.PlaybackNormal); //--> Why does this return null?!?!?!
}
VideoHandler类(DX9Device是SharpDX.Direct3D9.DeviceEx的别名)
这似乎是internal issue。
编辑:我将尝试使用Managed DirectX 9.0进行C#。
编辑:托管DirectX 9.0 for C#没有成功,在使用RenderToTexture时处理视频会抛出NullReferenceException而Microsoft不会为其API提供有价值的继承者。
编辑:现在尝试使用MediaFoundation for .NET(截至01 / dec / 2015)