Android Camera的进化史
Part1: ?Camera1(Android的傻瓜機)
- Camera1 的開發中,打開相機,設置參數的過程是同步的,就跟用戶實際使用camera的操作步驟一樣。但是如果有耗時情況發生時,會導致整個調用線程等待;
- 開發者如果想要個性化設置camera效果,無法手動設置調整參數,需要依靠第三方算法對于回調的數據進行處理(NV21)。而且不同手機的回調數據效果都是不一樣的,采用第三方算法調整,通常效果不好;
- 開發者所能獲取的Camera狀態信息有限;
camera1 的開發過程比較簡單,對于常規視頻采集,如果只要一般的預覽功能,是沒問題的,然而如果想要挖掘Camera更多的功能,camera1無法滿足,于是有了camera2.
Part2: Camera2(Android的單反)
- Camera2 的開發中,camera的生命周期都是異步的,即發送請求,等待回調的client-service模式;
- 系統: Android L+;
- 這里的關鍵回調主要是三個:
(1)CameraDevice.StateCallback ///比如線程A發送打開相機請求, 線程B中收到相機狀態回調,線程B中與cameraDevice建立會話,設置參數,數據回調處理;
(2)CameraCaptureSession.StateCallback ///與CameraDevice建立會話后,收到的會話狀態回調;
(3)ImageReader.OnImageAvailableListener?// 開發者可以直接獲取并且操作的數據回調;
- 通過跟相機建立的會話,可以更加精細的調整Camera參數:比如ISO感光度,曝光時間,曝光補償……;
- 如果開發者想要更多自己的定制,也可以直接使用回調數據(YUV488);
- MultiCamera的支持;
Multi-Camera 的支持:?
- 系統:Android P+;
- 目前支持的multi-camera的設備: Pixel 3, mate20 系列;
- Multi-Camera 新功能:
(1)更好的光學變焦:之前的方式通常使用數碼變焦或者是單個攝像頭的光學變焦來達到變焦的效果, 通過多攝像頭的變焦方式,無論遠景還是近景,都可以采到更好質量的數據。
(2)景深計算:通過多攝像頭的景深不同,可以得到每一幀圖片中不同物體的景深,從而更好的區分前景或者后景。應用范圍:背景虛化,背景替換,現實增強。
(3)更廣的視角:更廣的視角帶來魚眼鏡頭的畸變效果,畸變矯正功能。
CaptureRequest.DISTORTION_CORRECTION_MODE
(4)人臉識別功能:跟畸變效果一樣,自帶人臉識別功能。應用范圍:人臉裁剪,人臉特效。
CaptureResult.STATISTICS_FACE_DETECT_MODE
(5)多路流同時采集:場景包括(單攝像頭輸出多流,多攝像頭輸出多流)
normalOutputConfigImageReader.setPhysicalCameraId(normalLensId)
wideOutputConfigImageReader.setPhysicalCameraId(wideAngleId)
params.previewBuilder?.addTarget(normalSurface)
params.previewBuilder?.addTarget(wideSurface)
- 帶來的問題:更耗內存,更耗電
- 趨勢:單個手機中,支持更多的攝像頭
Camera2 雖然給開發者帶來了相機的更多可玩性,然而android的碎片化,導致很多設備的兼容性問題頻繁發生。尤其國內的手機廠商,對camera2 的支持程度各不相同,
所以Camera2的開發難度更多的是在兼容性,于是有了CameraX。
Part3: CameraX(Android的個性化相機)
- 系統:Android L+
- Jetpack 內的一套Camera開發支持庫。
- 特點:
- 更簡單易用的API,更少的代碼量,使開發者更專注業務的個性化實現。比如:對采集到圖片做分析處理。
- 更好的兼容性,減少不同設備適配煩惱:包括寬高比、屏幕方向、旋轉、預覽大小和高分辨率圖片大小。
- 數據分析: 開發者依然可以對數據進行個性化處理。
- 第三方Camera特效拓展:對于一些手機廠商特定實現的camera特效,開發者也可以使用。
- Code Sample 1(CameraX的常規使用)?
(1)CameraX 創建UseCaseConfig; //已經提前實現好各種UseCase(preview,ImageCapture,ImageAnalysis...)對應不同的UseCaseConfig, 開發者重要專注自己的業務。
(2)創建對應UseCase
(3)CameraX bindToLifecycle(LifeCycleOwner, UseCases)?//CameraX 會觀察生命周期以確定何時打開相機、何時創建拍攝會話以及何時停止和關閉。
(4)CameraX unbind(UseCase)
6.?Code Sample 2(CameraX的特效拓展)
Part4: 開發二三事
Rotation:Camera1 和 Camera2 上來的數據角度是不一樣;Camera2的某些設備,前置攝像頭的sensor orientation是不一致的。一般前置270,后置90。
- 相機角度獲取:
Camera1:CameraInfo.orientation
Camera2:CameraCharacteristics.SENSOR_ORIENTATION - 手機角度:
通過傳感器獲取:
(SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
- APP角度獲取:
通過WindowManager:
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);?
Coordinate system:Camera1 和 Camera2的坐標系不一樣,所以在View坐標和相機坐標系轉換的時候是不一樣的。
Camera1的坐標系:
Camera2的坐標系:
Render:
YUV數據的紋理映射:
- glGenTextures(...);///create glTexture id
- glBindTextures(...);?//bind texture into Gl context
- glTexParameterf(...);//filter param set when Texture Maping
- glTexImage2D(...);?// load YUV data
- GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0)?//unBinde Texture
?
離屏渲染:
- glGenFramebuffers(...);
- glBindFramebuffer(...);
- glFramebufferTexture2D(...); //bind?frame buffer with Texture
- glDrawArrays(...);?//draw texture data into?frame buffer?
- glReadPixels(...);?//get frame buffer data for snapshot.
- glBindFramebuffer(...);// unbind texture
GLSL:
- glCreateShader(...);
- glShaderSource(...);//bind Vertex/Segment program with Vertex/Segment object
- glCompileShader(...);
- glCreateProgram(...);
- glAttachShader(...);///attach?Vertex/Segment object with Shader program
- glLinkProgram(...);
- glUseProgram(...);?//draw
總結:
Camera的數據輸出格式:
| ? | ByteBuffer | Texture | FPS | Resolution |
| Camera1 | NV21 | Support | 30 | 1080P |
| Camera2 | I420 | Support | 30 | 1080P |
?
?
?
?
對于Texture的數據采集,直接在GPU中創建Texture Object并拿到Texture id,Camera 的采集數據直接交給texture object 進行離屏渲染。
對于Byte Buffer的數據采集,需要將YUV數據加載到紋理object,再進行離屏渲染。
兩種比較起來,直接用Texture 數據進行采集,可以省去cpu往GPU的數據拷貝過程,更高效。
?
Part5:Camera Next Plane:
?添加自己的CameraX功能
Reference :
https://developer.android.com/training/camerax/architecture;
https://source.android.com/devices/camera/multi-camera;
https://developer.android.com/guide/topics/media/camera
https://github.com/google/basicbokeh
https://github.com/IvenFu/Android-MultiCamera
https://medium.com/androiddevelopers/getting-the-most-from-the-new-multi-camera-api-5155fb3d77d9
?
?
?
總結
以上是生活随笔為你收集整理的Android Camera的进化史的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网易云信10月大事记
- 下一篇: 网易智慧企业亮相TOP 100 Summ