2016-02-11 71 views
2

目前,我在提供相機預覽紋理的屏幕上顯示相機預覽 - camera.setPreviewTexture(...)(當然使用opengl進行)。相機圖像上的CPU處理

我有一個本地庫,它獲取bytes[]作爲圖像,並返回一個byte[] - 與輸入圖像相關的結果圖像。我想調用它,然後將輸入圖像和結果繪製到屏幕上 - 彼此相對。

我知道在Opengl中,爲了將紋理數據返回到CPU中,我們必須使用glReadPixel來讀取紋理數據,之後我將不得不將結果加載到紋理 - 這將對性能產生重大影響去做每一幀。

我想過使用camera.setPreviewCallback(...),我得到了框架(調用過程方法並將結果傳遞給我的SurfaceView),並行地繼續使用紋理預覽技術來繪製屏幕,我害怕在previewCallback中獲得的幀與我在紋理中獲得的幀之間的同步。

我錯過了什麼嗎?或者有沒有簡單的方法來解決這個問題?

+0

你說得對,SurfaceTexture和onPreviewFrame之間沒有同步。只有幾分鐘前,我發佈了一個類似的[答案](http://stackoverflow.com/a/35341780/192373)。請檢查它與您的相關程度。 –

+0

不是我想閱讀的答案,但可悲的是,這是我以爲 –

+0

不要懲罰信使;)推動相機幀到自定義紋理是非常有效的Android上;我們已經達到了720p的30 FPS。 –

回答

1

可能有用的一種方法是將相機的輸出指向ImageReader,該表提供Surface。發送到Surface的每個幀都可以作爲YUV數據使用,而不需要複製,這使得它比一些替代品更快。顏色格式的變化(步幅,對齊,交錯)由ImageReader處理。

由於您希望攝像機圖像與處理輸出同時呈現,因此無法將幀向兩個獨立路徑發送。

當幀準​​備就緒時,您需要執行色彩空間轉換並使用glTexImage2D()上傳像素。這可能是性能限制因素。

從評論聽起來,你聽起來像你熟悉使用片段着色器的圖像過濾;對於發現此問題的其他人,您可以看到一個示例here

+0

你引用使用'camera2' api ..但不幸的是我的min sdk是18 ..所以我想我有使用'camera.setpreviewcallbackwithbuffer(...)'做到這一點 –

+1

實際上,原始相機API可以將輸出發送到Surface,但ImageReader直到API 19才被引入。 – fadden

+0

是否可以將表面ImagerReader到相機(camera1 api)? –