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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Camera2打开相机,建立会话,并监听相机流(以拍照为例)

發布時間:2023/12/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Camera2打开相机,建立会话,并监听相机流(以拍照为例) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Camera2打開相機,建立會話,并監聽相機流(以拍照為例)

  • 獲取 CameraManager
  • 通過 CameraManager.openCamera() 方法打開相機,監聽回調,獲取 CameraDevice
  • 通過 CameraDevice.createCaptureSession() 方法,建立會話,監聽回調,獲取 CameraCaptureSession
  • 創建 CaptureRequest
  • CameraCaptureSession 通過 setRepeatingRequest 或 capture 方法,進行會話,通過捕獲相機流,對相機流進行處理
  • 細節

  • 獲取 CameraManager

    (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
  • 通過 CameraManager.openCamera() 方法打開相機,監聽回調,獲取 CameraDevice

    /*** 參數* cameraId 前置或后置攝像頭ID,前置 1 后置 0* callback* handler 表示 openCamera 代碼運行所在的線程,傳null,表示運行在當前線程*/ mCameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {@Overridepublic void onOpened(@NonNull CameraDevice camera) {mCameraDevice = camera;}@Overridepublic void onDisconnected(@NonNull CameraDevice camera) {}@Overridepublic void onError(@NonNull CameraDevice camera, int error) {}}, null);
  • 通過 CameraDevice.createCaptureSession() 方法,建立會話,監聽回調,獲取 CameraCaptureSession

    // width 和 height 與 surfaceview 的相同//ImageReader 用于接收處理(拍照、錄像)的相機流//SurfaceView 用于接收預覽的相機流ImageReader mImageReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);List<Surface> surfaces = new ArrayList<>();surfaces.add(surfaceView.getHolder().getSurface());surfaces.add(mImageReader.getSurface());/*** 參數* outputs 相機流輸出的地方* callback* handler 表示 createCaptureSession 代碼運行所在的線程,傳null,表示運行在當前線程*/ mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession session) {mCameraCaptureSession = session;}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession session) {}}, null);
  • 創建 CaptureRequest

    // 創建用于預覽的CaptureRequestCaptureRequest.Builder captureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);//相機流輸出的位置captureRequest.addTarget(surfaceViewSurface);CaptureRequest build = captureRequest.build(); // 創建用于處理照片的CaptureRequestCaptureRequest.Builder captureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);//相機流輸出的位置captureRequest.addTarget(mImageReader.getSurface());CaptureRequest build = captureRequest.build();
  • CameraCaptureSession 通過 setRepeatingRequest 或 capture 方法,進行會話,通過捕獲相機流,對相機流進行處理

    //連續通信,用于預覽 mCameraCaptureSession.setRepeatingRequest(captureRequest.build(), null, null); //一次通訊,用于拍照 //先將 mImageReader 中的內容清空 while (mImageReader.acquireNextImage() != null){}// mImageReader 捕獲相機流中的信息 mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {@Overridepublic void onImageAvailable(ImageReader reader) {Image image = reader.acquireNextImage();// 轉成 BitmapByteBuffer buffer = image.getPlanes()[0].getBuffer();byte[] b = new byte[buffer.capacity()];buffer.get(b, 0 , b.length);Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);// 釋放 Image,否則,不能進行下次捕獲,因為定義時,設置的只能捕獲一張圖片image.close();}}, null);CaptureRequest.Builder captureRequest = mCameraCaptureSession.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);captureRequest.addTarget(mImageReader.getSurface());//進行通信mCameraCaptureSession.capture(captureRequest.build(), null, null);
  • 細節

    • SurfaceView 使用時,必須已經在界面中顯示,否則,獲取 surface 時,會異常
    • ImageReader 捕獲照片時,Image 處理完后,必須執行 image.close()

總結

以上是生活随笔為你收集整理的Camera2打开相机,建立会话,并监听相机流(以拍照为例)的全部內容,希望文章能夠幫你解決所遇到的問題。

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