使用指针跨过程传递纹理

时间:2008-12-01 16:58:24

标签: c# .net directx directshow direct3d

很难将其纳入标题,所以让我解释一下。

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

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

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

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

我在这两个进程上都有TCP通信设置,让我们不要担心此时通信指针。

这可能是一个疯狂的想法,但它可能会让人感到惊讶

5 个答案:

答案 0 :(得分:2)

是的,您可以使用Direct3D 9Ex执行此操作。这仅适用于Vista,您必须使用Direct3DDevice9Ex。您可以阅读有关分享resources here.

的信息

答案 1 :(得分:1)

  

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

为什么不直接修复此错误?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

传递纹理不起作用。

我会使用以下方法来实现:

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

请注意,您需要将图片数据传输到图形卡。最大的区别在于此转移现在发生在Direct3D应用程序中,而不是在DirectShow应用程序中。

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

答案 4 :(得分:0)

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