用于视频编辑的进程间数据交换

时间:2015-11-30 03:35:08

标签: c++ opencv mfc ipc

我正在使用Visual C ++ 2013。 我有两个应用程序(它们在同一台机器上运行):

  • 第一个应用程序从多个客户端接收高质量视频流,同步这些视频并将其写入视频文件(仅限H264,DIVX和MJPG)

  • 第二个应用程序对这些视频中的每组同步帧进行一些处理(使用OpenCV)

然而,由于进/出磁盘的读/写任务非常慢,我在两个进程之间遇到了交换数据​​。因此,我希望以低延迟直接在RAM上交换数据,并逐帧处理。

我读过 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.aspx 但我不知道处理这件事。

请帮帮我。非常感谢。

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。最简单的一个是通过WM_COPYDATA

 COPYDATASTRUCT cds;
 cds.dwData = 0;
 cds.cbData = 5 * sizeof(WCHAR);
 cds.lpData = L"Hello";

 ::SendMessage(hTargetWnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&cds);

您可以通过调用:

轻松找到目标窗口句柄
HWND hTargetWnd = ::FindWindow(NULL, L"AppName");

另一种方法基于共享内存。如果你确实使用MFC框架,那么有CSharedFile类来实现这种类型的IPC。

您也可以使用UDP套接字进行IPC。这里有几个好处:

  1. 无需建立连接
  2. 数据包丢失几乎是不可能的,因为数据是通过环回接口传输的。
  3. 再次,如果它是基于MFC的应用程序,我会使用CAsyncSocket类。

答案 1 :(得分:0)

我猜你有一个框架流,然后你分发给工人应用程序进行处理。我会考虑使用ZeroMQ。原因:

  • ZeroMQ已经基于消息,因此不像TCP(基于流)或UDP(有限的帧大小),您可以传输大型邮件,而不必担心碎片。
  • 它管理(重新)连接和其他一些可以降低应用程序复杂性的事情。
  • 它有一个共享的内存传输机制(你必须检查它是否在MS Windows下受支持),这对你的用例应该足够有效。
  • 如果您想将作品分发到多台机器,它还支持TCP传输。
  • 它具有许多语言和许多操作系统的绑定,以防您以后想要扩展范围。