這不是一個簡單的練習,但它可以完成。我知道,因爲我以前做過。 :)
我在C++中實現了這一點。
你需要做的是創建所謂的共享內存服務器。共享內存服務器是多個進程可以訪問的ram區域。以下是如何創建一個使用Windows下的命名共享內存:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx
在您的應用程序,它從兩個攝像頭混合的視頻,你需要創建一個DirectShow渲染過濾器(CBaseRenderer)寫入混合視頻幀進入這個共享內存。
另一方面,您需要創建一個單獨的Visual Studio DLL項目,該項目將實現DirectShow捕獲篩選器(CSource和CSourceStream),該篩選器將讀取您的主應用程序寫入此緩衝區的視頻位圖。這個VS項目需要是一個可註冊的DLL,可以將其註冊爲Windows的DirectShow捕獲設備。
您的主應用程序將在其運行時創建並維護此共享內存緩衝區。如果另一個應用程序(如視頻會議程序)訪問捕獲設備,則來自該設備的所有內容都將爲空白緩衝區,直到主應用程序明星將實際視頻幀添加到該應用程序爲止。提示1:由於這是一個多線程操作,因此您需要一個事件句柄來通知捕獲過濾器一個幀已準備就緒。您還需要一個互斥鎖來控制應用程序中的「渲染」線程和捕獲設備中的「捕獲」線程對緩衝區的訪問。提示#2:你不需要在內存指針上調用UnmapViewOfFile或CloseHandle,直到渲染或捕獲過濾器被處置。
有很多代碼需要研究,所以任何有用的例子都不在本次討論的範圍之內。這應該讓你朝着正確的方向前進。祝你好運!
我剛剛檢查了我的舊代碼。它總共花了1500行代碼來實現整個事情(渲染過濾器,捕獲過濾器和DLL) - 而不是「成千上萬」的代碼行。 – Escovado