Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于视频编辑的进程间数据交换 我使用Visual C++ 2013。 我有两个应用程序(它们在同一台机器上运行):_C++_Opencv_Mfc_Ipc - Fatal编程技术网

用于视频编辑的进程间数据交换 我使用Visual C++ 2013。 我有两个应用程序(它们在同一台机器上运行):

用于视频编辑的进程间数据交换 我使用Visual C++ 2013。 我有两个应用程序(它们在同一台机器上运行):,c++,opencv,mfc,ipc,C++,Opencv,Mfc,Ipc,第一个应用程序从多个客户端接收高质量视频流,同步这些视频并将其写入视频文件(仅H264、DIVX和MJPG) 第二个应用程序对这些视频中的每组同步帧进行一些处理(使用OpenCV) 但是,我陷入了两个进程之间的数据交换中,因为磁盘的读/写任务非常慢。因此,我希望以低延迟直接在RAM上交换数据,并逐帧处理数据 我读过 但我不知道该怎么办 请帮帮我。非常感谢 有很多方法可以做到这一点。最简单的方法是通过WM_COPYDATA: COPYDATASTRUCT cds; cds.dwData =

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

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

  • 但是,我陷入了两个进程之间的数据交换中,因为磁盘的读/写任务非常慢。因此,我希望以低延迟直接在RAM上交换数据,并逐帧处理数据

    我读过 但我不知道该怎么办


    请帮帮我。非常感谢

    有很多方法可以做到这一点。最简单的方法是通过
    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框架,则存在实现这种IPC类型的
    CSharedFile

    您还可以将UDP套接字用于IPC。这里有几个好处:

  • 不需要建立连接
  • 数据包丢失几乎是不可能的,因为数据是通过环回接口传输的
  • 同样,如果它是基于MFC的应用程序,我会使用
    CAsyncSocket
    class

  • 我猜您有一个帧流,然后将其分发到worker应用程序进行处理。我会考虑使用ZrOMQ。原因:

    • ZeroMQ已经基于消息,因此与TCP(基于流)或UDP(有限帧大小)不同,您可以传输大型消息,而无需担心碎片
    • 它管理诸如(重新)连接和其他一些降低应用程序复杂性的事情
    • 它有一个共享内存传输机制(您必须检查MS Windows是否支持该机制),对于您的用例来说,该机制应该足够有效
    • 它还支持TCP传输,以防您希望将工作分配到多台机器
    • 它为多种语言和多种操作系统提供了绑定,以防以后需要扩展范围

    对于视频来说,使用共享内存绝对有意义。Microsoft Windows有用于此的API。我用过它们来做这类事情,效果很好。您需要一种在两个进程之间打开共享内存的机制和一种同步方法(如事件)。您需要浏览Windows操作系统手册中的处理器间通信部分。只是想知道,为什么你需要第二个过程呢?你不能在一个线程中完成OpenCV工作吗?这是客户的命令。