在跟随我的previous question后,我可以将Direct3DDevice的后备缓冲区保存到曲面。
我已经在DirectX SDK中找到了D3DXSaveSurfaceToFile,它运行正常!但是,我想将获得的曲面记录到AVI文件中。
我还找到了AVIFile reference,但它们显然不能与DirectX表面直接兼容。
解决此问题的最佳方法是什么?我已经看到了许多基于GDI + / MVC的抓取HDC的解决方案,但这些都是不可能的。我也不确定AVIFile期望的数据类型以及如何从D3DSurface中提取它。
请指教! :)
编辑:
后处理也是一种选择。我可以使用here将指定D3DXSaveSurfaceToFileInMemory的多种格式的表面数据捕获到内存中。之后,我可以压缩这些数据,然后存储到磁盘。
我应该如何压缩数据?我应该如何存储它?我是否存储时间戳?录制后,如何将生成的数据转换为AVI文件?
答案 0 :(得分:2)
此链接的源代码将向您展示如何操作:
http://gpalem.web.officelive.com/SimulationRecording.html
编辑:您不必完全像链接代码那样做。你有一个D3DSurface,所以你可以锁定它抓取位并将它们传递到CAviFile :: AppendFrameUsual ...如果你想改变它的格式,那么使用D3DXLoadSurfaceFromSurfac e。我没有说链接是一个完美的解决方案,但它会告诉你如何将帧写入AVi文件。
Edit2 :由于我没有回答您的编辑,我应该这样做。首先,在没有压缩工作之前,不要费心去压缩。压缩是一个非常复杂的事情,只需使用各种D3DXSurface复制功能,您将无法获得适当的压缩。它们不支持您所追求的压缩类型。 D3DX用于3D渲染,不用于视频压缩。
对于视频压缩,您最好尽可能使用DirectShow,只需添加您想要的任何压缩器。但这意味着你需要编写一个“源过滤器”,你可以建立你的图形。 DirectShow不是一件容易使用的东西,但它非常强大。至于编写“源过滤器”,您可以查看Windows SDK中的“推送源”示例。但是,您需要对其进行调整以获取要检索的数据。
顺便说一句,继续我的原始编辑,您可以通过截取更多D3D9调用来使用该代码。如果您挂钩SetRenderTarget调用,那么您可以在那里插入您喜欢的任何渲染目标,并直接使用以前链接的代码......