2011-09-24 123 views
0

我需要從同一臺計算機上的2個攝像頭獲取流媒體,並將其作爲假攝像頭混合(然後我可以在任何軟件上使用假攝像頭)。 我已經看到camcamx適用於mac,webcamstudio適用於linux,但我需要windows解決方案,而且我無法找到它,所以我正在考慮編寫自己的小應用程序。 我可以用C#,Java和lazarus編程,但是任何語言的示例或庫或任何其他語言都將有所幫助。將2個真實攝像頭混合到假攝像頭

我需要製作一個假攝像頭,可以用作網絡攝像頭(在我的計算機上檢測爲usb網絡攝像頭),以及一些代碼來抓取來自兩個真實攝像頭的流,並將所有內容混合在一起(會有像一個主要的網絡攝像頭,將會更大,次要網絡攝像頭會更小,在大圖像的角落)

任何人都可以幫助我嗎?

回答

0

我認爲你的問題遠遠超出了本網站的全部內容。如果你打算自己編寫這個軟件,那麼你正在談論成千上萬的代碼行和對驅動程序,視頻解碼,混音等的深入瞭解。

這樣說,有可能軟件爲此用於Windows。從實際攝像頭

2

這不是一個簡單的練習,但它可以完成。我知道,因爲我以前做過。 :)

我在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,直到渲染或捕獲過濾器被處置。

有很多代碼需要研究,所以任何有用的例子都不在本次討論的範圍之內。這應該讓你朝着正確的方向前進。祝你好運!

+0

我剛剛檢查了我的舊代碼。它總共花了1500行代碼來實現整個事情(渲染過濾器,捕獲過濾器和DLL) - 而不是「成千上萬」的代碼行。 – Escovado