日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Camera的进化史

發布時間:2025/3/8 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Camera的进化史 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Part1: ?Camera1Android的傻瓜機)

  • Camera1 的開發中,打開相機,設置參數的過程是同步的,就跟用戶實際使用camera的操作步驟一樣。但是如果有耗時情況發生時,會導致整個調用線程等待;
  • 開發者如果想要個性化設置camera效果,無法手動設置調整參數,需要依靠第三方算法對于回調的數據進行處理(NV21)。而且不同手機的回調數據效果都是不一樣的,采用第三方算法調整,通常效果不好;
  • 開發者所能獲取的Camera狀態信息有限;

camera1 的開發過程比較簡單,對于常規視頻采集,如果只要一般的預覽功能,是沒問題的,然而如果想要挖掘Camera更多的功能,camera1無法滿足,于是有了camera2.

Part2 Camera2Android的單反)

  • Camera2 的開發中,camera的生命周期都是異步的,即發送請求,等待回調的client-service模式;
  • 系統: Android L+
  • 這里的關鍵回調主要是三個:

1CameraDevice.StateCallback ///比如線程A發送打開相機請求, 線程B中收到相機狀態回調,線程B中與cameraDevice建立會話,設置參數,數據回調處理;

2CameraCaptureSession.StateCallback ///CameraDevice建立會話后,收到的會話狀態回調;

3ImageReader.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 CameraXAndroid的個性化相機)

  • 系統:Android L+
  • Jetpack 內的一套Camera開發支持庫。
  • 特點:
  • 更簡單易用的API,更少的代碼量,使開發者更專注業務的個性化實現。比如:對采集到圖片做分析處理。
  • 更好的兼容性,減少不同設備適配煩惱:包括寬高比、屏幕方向、旋轉、預覽大小和高分辨率圖片大小。
  • 數據分析: 開發者依然可以對數據進行個性化處理。
  • 第三方Camera特效拓展:對于一些手機廠商特定實現的camera特效,開發者也可以使用。
  • Code Sample 1CameraX的常規使用)?

1CameraX 創建UseCaseConfig; //已經提前實現好各種UseCasepreview,ImageCapture,ImageAnalysis...)對應不同的UseCaseConfig, 開發者重要專注自己的業務。

2)創建對應UseCase

3CameraX bindToLifecycle(LifeCycleOwner, UseCases)?//CameraX 會觀察生命周期以確定何時打開相機、何時創建拍攝會話以及何時停止和關閉。

4CameraX unbind(UseCase)

6.?Code Sample 2CameraX的特效拓展)

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 systemCamera1 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 idCamera 的采集數據直接交給texture object 進行離屏渲染。

對于Byte Buffer的數據采集,需要將YUV數據加載到紋理object,再進行離屏渲染。

兩種比較起來,直接用Texture 數據進行采集,可以省去cpuGPU的數據拷貝過程,更高效。

?

Part5Camera 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的进化史的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。