2015-11-20 120 views
0

我試圖在兩個進程之間共享從USB攝像頭(Logitech c270)接收的幀(圖像),以便我可以避免memcpy。我使用內存映射流I/O方法描述here,我可以在使用v4l2_mmap後成功從相機獲取幀。但是,我有另一個進程(用於圖像處理),它必須在出隊後使用圖像緩衝區,並通知第一個進程再次對緩衝區進行排隊。v4l2是否支持多圖?

網上搜索,我能找到打開視頻設備多次是允許的,但是當我嘗試映射成功v4l2_open後(嘗試都v4l2_mmap,只是mmap)在第二過程中,我得到一個EINVAL錯誤。

我找到了this pdf,它討論了在v4l2(非官方)中實現多圖的問題,並且想知道這是否實現。我也嘗試過使用用戶指針流I/O方法,其中的文檔明確指出可以在此方法中實現共享內存,但當我請求緩衝區時,我得到一個EINVAL(根據linuxtv.org中的文檔,這意味着相機不支持用戶指針流式I/O)。

注:我想保持代碼模塊化,因此有兩個過程。如果這是不可能的,則在單個進程中完成所有工作(多線程&全局幀緩衝區)仍然是可能的。 使用標準共享內存函數調用是不可能的,因爲這兩個進程必須映射到視頻設備文件(/dev/video0),我不能在/dev/shm之下。

回答

0

多用戶mmap的主要問題是這需要在設備驅動程序端執行。即:即使某些設備可能支持多地圖,其他設備也可能不支持。

所以,除非您可以控制與您的應用程序一起使用的相機,否則最終會遇到一個不適用的相機,在這種情況下,您的應用程序將無法工作。

因此,無論如何,您的應用程序應該提供處理非多地圖設備的方法。

順便說一句,你不需要多個進程來保持你的代碼模塊化。 多進程有其優點(例如privilige分離,防撞彈性,...),但也可能鼓勵重複代碼...

0

這可能不是現在相關.....

你不」不需要使用完整的多用途消費者來做到這一點。我已經使用Python將mmap緩衝區的處理交給多個進程(python多線程一次只允許1個線程執行)

如果你正在運行多線程,那麼工作線程可以拿起緩衝區並在主線程觸發時獨立處理它

由於代碼顯然非常pythonesq我不會在這裏發佈它,因爲它在其他語言中沒有意義,因爲它使用python多處理支持。