Androoid 視頻、圖像採集時相機預覽時的效率改善問題

曾經試圖在GPUImage這個工程基礎之上來開發一個項目,由於這個開源工程很知名,start非常多,就毫不猶豫地將這個工程拿來用了。誰知功能完成進入測試階段之後,才暴露出各種問題和坑點。

        第一個坑點是當一個渲染管道疊加了兩個以上的濾鏡的時候,稍微低端一點的手機已經在相機預覽的時候已經卡得不行了。

第二個坑點是,錄製的過程中會概率性的包EGL_BAG_SURFACE錯誤,然後預覽界面就定住了。由於這個問題是OpenGL ES 報錯,修復起來還是比較麻煩的。

       下面就解決第一個坑點作一些總結:

       要在界面上顯示相機的預覽畫面,先要拿到camera 輸出的預覽圖像數據。

       而拿到相機的預覽數據有兩種方法:

       第一種是利用 camera.setPreviewCallback()方法,在回調的方法中可以拿到相機的yuv數據,然後將yuv轉爲RGB數據,得到一張bitmap。然後將bitmap繪製到UI的預覽區域。

       GpuImage就是利用這種方案。這種方案的弊端在呀,要獲得callback的yuv數據,必須在camera.setPreviewCallback()調用camera.setPreviewTexture方法,將預覽數據先輸入到一個surfaceTexture中,即使這個surfaceTexture不用顯示在界面上。這就產生了一個冗餘的數據處理過程。

      其實如果善於利用camera.setPreviewTexture()方法,camera.setPreviewCallback()是用不着的,而且SurfaceTexture 默認是GPU運算,它的直接可以接受yuv格式的紋理,少了一個轉RGB的過程。另外,SurfaceTexture可以更方便地與openGL es API 配合。

       只是,在編寫shader時,注意,SurfaceTexture的紋理類型和 openGL 繪圖時的 fragment shader 中接收預覽數據的sample2D 類型都應該是 external_OES的,具體可以參考我寫的這個Demo

       近期計劃對Android 版的 GPUImage作持續的改進,歡迎關注我的CSDN和github帳號!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章