1

在跟进我之前的问题时,我能够将 Direct3DDevice 的后缓冲区保存到表面。

我已经在 DirectX SDK 中找到了 D3DXSaveSurfaceToFile,它工作正常!但是,我想将获得的表面记录到 AVI 文件中。

我还找到了AVIFile 参考,但它们显然与 DirectX 表面不直接兼容。

解决这个问题的最佳方法是什么?我见过许多基于 GDI+/MVC 的抓取 HDC 的解决方案,但这些都是不可能的。我也不确定 AVIFile 需要什么样的数据以及如何从 D3DSurface 中提取它。

请指教!:)

编辑:

后处理也是一种选择。我可以使用D3DXSaveSurfaceToFileInMemory以多种格式(在此处指定)将表面数据捕获到内存中。之后,我可以压缩这些数据,然后存储到磁盘。

我应该如何压缩我的数据?我应该如何存储它?我是否存储时间戳?录制完成后,如何将生成的数据转成AVI文件?

4

1 回答 1

2

此链接上的源代码将向您展示如何做到这一点:

http://gpalem.web.officelive.com/SimulationRecording.html

编辑:嗯,你不必做与链接代码完全一样的事情。您有一个 D3DSurface,因此您可以锁定它并抓取这些位并将它们传递给 CAviFile::AppendFrameUsual ...如果您想更改其格式,请使用D3DXLoadSurfaceFromSurfac e。我没有说该链接是一个完美的解决方案,但它确实向您展示了如何将帧写入 AVi 文件。

Edit2:因为我没有回答您的编辑,所以我应该做。首先,在您获得未压缩的工作之前,不要为压缩而烦恼。压缩是一件非常复杂的事情,要正确进行,您将无法通过简单地使用各种 D3DXSurface 复制功能来获得适当的压缩。它们不支持您所追求的压缩类型。D3DX 用于 3D 渲染,而不用于视频压缩。

对于视频压缩,您最好使用 DirectShow,因为您可以简单地添加任何您想要的压缩器。然而,这意味着您需要编写一个“源过滤器”,您可以构建您的图表。DirectShow 不是一个容易使用的东西,但它非常强大。至于编写“源过滤器”,您可以查看 Windows SDK 中的“推送源”示例。但是,您需要对其进行调整以获取您正在检索的数据。

顺便说一句,继续我的原始编辑,您可以通过拦截更多 D3D9 调用来使用该代码。如果您挂钩 SetRenderTarget 调用,那么您可以在其中插入您喜欢的任何渲染目标,并直接使用之前链接的代码......

于 2010-09-27T10:19:26.843 回答