很难将其纳入标题,所以让我解释一下。
我有一个应用程序使用Direct3D显示一些网格和directshow(vmr9 + allocator)来播放一些视频,然后将视频帧作为纹理发送到Direct3D部分以应用到网格上。该应用程序需要24/7运行。至少它允许每24小时重新启动一次,但不会比这更频繁。
现在的问题是,由于编解码器,视频驱动程序或视频文件本身,directshow似乎在播放几个小时后出现问题。此时应用程序只是拒绝播放视频。但Direct3D部分仍然正常运行,仍然显示网格。重新启动应用程序后,一切恢复正常。
所以,我正在考虑将这两个部分分成两个不同的过程。因此,当视频进程无法播放视频时,至少我可以立即重新启动它,而不会丢失Direct3D部分。
所以这里有一个实际问题,是否可以通过传递指针将纹理从视频播放器传递到direct3d进程,也就是从指针中检索另一个进程的纹理?由于受保护的内存寻址,我的初步猜测是不可能的。
我在这两个进程上都有TCP通信设置,让我们不要担心此时通信指针。
这可能是一个疯狂的想法,但它可能会让人感到惊讶
答案 0 :(得分:2)
是的,您可以使用Direct3D 9Ex执行此操作。这仅适用于Vista,您必须使用Direct3DDevice9Ex。您可以阅读有关分享resources here.
的信息答案 1 :(得分:1)
现在的问题是,由于编解码器,视频驱动程序或视频文件本身,directshow似乎在播放几个小时后出现问题。此时应用程序只是拒绝播放视频。
为什么不直接修复此错误?
答案 2 :(得分:0)
如果你把它分开作为一个单独的进程,那么我怀疑这是不可能的,但是如果它是一个孩子线程那么他们会有共享内存寻址我信。
答案 3 :(得分:0)
传递纹理不起作用。
我会使用以下方法来实现:
请注意,您需要将图片数据传输到图形卡。最大的区别在于此转移现在发生在Direct3D应用程序中,而不是在DirectShow应用程序中。
您也可以尝试使用VMR。我不确定自定义分配器/渲染器部件是否允许您渲染到共享内存中。
答案 4 :(得分:0)
也许您可以在DirectShow主机进程中使用Sample Grabber将图像作为系统内存缓冲区。然后,您可以使用WriteProcessMemory将数据写入Direct3D应用程序中预先约定的地址(通过TCP或其他设置)。