0

很难把它放在标题中,所以让我解释一下。

我有一个应用程序,它使用 Direct3D 显示一些网格并使用 directshow(vmr9 + allocator) 播放一些视频,然后将视频帧作为纹理发送到 Direct3D 部分以应用于网格。该应用程序需要 24/7 全天候运行。至少允许每 24 小时重新启动一次,但不会比这更频繁。

现在的问题是,由于编解码器、视频驱动程序或视频文件本身,directshow 在播放几个小时后似乎出现了问题。此时应用程序只是拒绝播放视频。但是 Direct3D 部分仍然运行良好,网格仍然显示。重新启动应用程序后,一切恢复正常。

所以,我正在考虑将 2 个部分分成 2 个不同的过程。因此,当视频进程无法播放视频时,至少我可以立即重新启动它,而不会丢失 Direct3D 部分。

所以这里出现了实际的问题,是否可以通过传递指针将纹理从视频播放器传递到 direct3d 进程,也就是从指针中检索另一个进程的纹理?由于受保护的内存寻址,我最初的猜测是不可能的。

我在两个进程上都设置了 TCP 通信,此时我们不必担心指针的通信。

这可能是一个疯狂的想法,但它会创造奇迹

4

5 回答 5

2

是的,您可以使用 Direct3D 9Ex 做到这一点。这仅适用于 Vista,您必须使用 Direct3DDevice9Ex。您可以在此处阅读有关共享资源的信息。

于 2009-08-29T03:36:21.470 回答
1

现在的问题是,由于编解码器、视频驱动程序或视频文件本身,directshow 在播放几个小时后似乎出现了问题。此时应用程序只是拒绝播放视频。

为什么不直接修复这个错误呢?

于 2008-12-01T17:27:26.680 回答
0

如果你把它作为一个单独的进程分开,那么我怀疑这是不可能的,但如果它是一个子线程,那么我相信他们会有共享内存寻址。

于 2008-12-01T17:04:51.310 回答
0

传递纹理不起作用。

我会使用以下方法来做到这一点:

  • 将 VMR 替换为将图片放入内存的自定义渲染器+分配器
  • 您从共享内存池中为图片分配内存
  • 一旦你收到另一张照片,你就发出了一个事件的信号
  • Direct3D 进程等待此事件并使用新纹理更新网格

请注意,您需要将图片数据传输到显卡。最大的不同是,这种传输现在发生在 Direct3D 应用程序中,而不是在 DirectShow 应用程序中。

您也可以尝试为此使用 VMR。我不确定自定义分配器/渲染器部分是否允许您渲染到共享内存中。

于 2008-12-01T17:31:51.007 回答
0

也许您可以在 DirectShow 主机进程中使用 Sample Grabber 来获取图像作为系统内存缓冲区。然后,您可以使用 WriteProcessMemory 将数据写入 Direct3D 应用程序中预先约定的地址(通过 TCP 或其他方式设置)。

于 2009-05-11T17:15:25.573 回答