2012-05-27 54 views
17

我想用原始圖像進行圖像處理而不在屏幕上顯示,這顯然會降低性能。Android SDK:獲取原始預覽攝像頭圖像而不顯示它

根據對這個線程的回答Taking picture from camera without preview它在Android 1.5中是不可能的,但是有人知道它是否可以在Android 4(API級別15)中使用?

+0

剛剛在三星Galaxy S5上嘗試了假SurfaceTexture解決方案(方法2)。它幾幀後確實失敗。我的解決方法是實際調用updateTexImage,但使用具有有效GL上下文的無效紋理名稱。靜音產生的異常後,一切正常。 – user3693576

回答

41

在Android 4中,接收原始圖像數據而不顯示在屏幕上的最簡單方法是使用Camera.setPreviewTexture()調用將預覽幀路由到GPU。

您可以通過兩種方式使用:

  1. 做你的實際處理的GPU:設置OpenGL上下文(OpenGL ES 2 tutorial),並建立在這方面一個SurfaceTexture對象。然後將該對象傳遞給setPreviewTexture,並開始預覽。然後,在您的OpenGL代碼中,您可以調用SurfaceTexture.updateTexImage,並將與SurfaceTexture關聯的紋理ID更新爲攝像頭的最新預覽幀。如果需要,您還可以使用glReadPixels將RGB紋理數據讀回CPU以作進一步處理。
  2. 在CPU上進行處理:您可以簡單地創建一個虛擬SurfaceTexture對象,而無需設置任何OpenGL上下文。將所需的任何整數作爲紋理ID傳遞,並使用setPreviewTexture將SurfaceTexture連接到相機。只要您不調用updateTexImage,SurfaceTexture將簡單地丟棄相機傳遞給它的所有數據。然後使用setPreviewCallback設置預覽回調,並將該數據(通常採用YUV格式)用於CPU處理。這可能比#1效率低,但不需要知道OpenGL。
+0

有沒有人遇到SurfaceTexture.updateTexImage返回後使用glReadPixels的簡單示例? – wobbals

+0

方法2不適用於Nexus 4. – user1914692

+0

@wobbals:不能直接將'glReadPixels()'Camera輸出(與http:// stackoverflow相同的問題。COM /問題/ 19366660 /如何到保存,表面紋理,作爲位圖/ 19370209#19370209)。首先將其渲染爲pbuffer。一些指向這裏的例子:http://stackoverflow.com/questions/20710204/android-camera-preview-on-surfacetexture/21104769#21104769 – fadden

1

由於我不允許發表評論。關於艾迪的回答。您需要在NDK中使用這個功能,因爲使用Java接口會消除任何性能優勢。從性能的角度來看,與PixelBuffer一起工作絕對是瘋狂的。從RGBA888到YUV的轉換也需要在C中完成。

不要嘗試使用TextureView會更糟糕。在轉換爲YUV之前,您必須將像素複製到位圖中,然後從位圖複製到陣列中。這本身就佔據了新品Nexus 7 2013品牌幾乎30%的CPU利用率。

最有效的方法是直接與Camera.h交談並繞過所有Android API。您可以創建自己的緩衝區並在YUV數據到達任何其他位置之前攔截YUV數據。

+1

雖然預覽回調沒有我想要的那樣高效,但它們不是可怕。您可以獲得每幀YUV數據的byte []數據,可以通過JNI將其發送到零拷貝的本機處理代碼。沒有轉換到位圖或其他需要的東西。直接使用Camera.h是一個不好的主意,因爲該接口是私有的,隨時可能改變。 –

+0

預覽回調僅適用於Surface。問題是關於如何去做而不顯示它。沒有Surface的唯一方法是使用PixelBuffer。從性能角度來看,標準回調w/Surface更好。每個回調有兩個週期。攝像機複製到內部緩衝區;然後進入RGBA表面緩衝區。第二個週期將內部緩衝區複製到回調緩衝區中。 – bond

+0

我真的不確定PixelBuffer是什麼意思 - 我沒有在Android中知道該名稱的API(您的意思是位圖?)。除了setPreviewDisplay()之外,預覽回調還可以與setPreviewTexture()一起正常工作,前者不需要對任何UI元素進行圖形預覽。我同意,本機和JNI圖層中的副本是性能拖拽,這就是爲什麼我也提出了GPU處理方法,它沒有開銷。 –

1

在屏幕上顯示預覽不會產生性能影響。在我遇到的所有設備上,相機輸出「連線」到不涉及CPU的表面或紋理,所有顏色轉換和縮放均由專用硬件處理。

可能有其他原因來「隱藏」預覽,但請記住,API的目的最初是爲了確保最終用戶能夠看到從相機到應用程序的任何內容,出於隱私和安全原因。

相關問題