From f282ccfb392a5b5a019cd4c4133cf3310e142a63 Mon Sep 17 00:00:00 2001
From: whycxzp <glperry@163.com>
Date: 星期五, 19 七月 2024 17:09:17 +0800
Subject: [PATCH] 更新

---
 app/src/main/java/com/whyc/widget/Camera2TextureView2.java |   96 +++++++++++++++++++++++++----------------------
 1 files changed, 51 insertions(+), 45 deletions(-)

diff --git a/app/src/main/java/com/whyc/widget/Camera2TextureView2.java b/app/src/main/java/com/whyc/widget/Camera2TextureView2.java
index eb44cde..e7baeb8 100644
--- a/app/src/main/java/com/whyc/widget/Camera2TextureView2.java
+++ b/app/src/main/java/com/whyc/widget/Camera2TextureView2.java
@@ -4,13 +4,16 @@
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.ImageFormat;
+import android.graphics.Rect;
 import android.graphics.SurfaceTexture;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CameraMetadata;
 import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.params.StreamConfigurationMap;
 import android.media.Image;
 import android.media.ImageReader;
 import android.media.MediaRecorder;
@@ -23,16 +26,13 @@
 import android.support.annotation.NonNull;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.util.Range;
 import android.view.Surface;
 import android.view.TextureView;
 import android.view.View;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 import android.widget.Toast;
-
-import com.whyc.util.HttpRequestUtil;
-import com.whyc.util.tool.HttpReqData;
-import com.whyc.util.tool.HttpRespData;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -64,6 +64,7 @@
     private Handler mainHandler = new Handler(Looper.getMainLooper());
     private HandlerThread mThreadHandler;
     ScheduledExecutorService executorService;
+    ScheduledExecutorService scheduledExecutorService;
 
     //涓婚〉闈㈢殑瑙嗗浘
     private LinearLayout llUpText;
@@ -74,6 +75,7 @@
 
     private int imageWeight = 1920;
     private int imageHeight = 1080;
+    Range<Integer> rangeMin;
 
     public Camera2TextureView2(Context context) {
         super(context,null);
@@ -81,7 +83,7 @@
 
     public Camera2TextureView2(Context context, AttributeSet attrs) {
         super(context, attrs);
-        executorService = Executors.newScheduledThreadPool(2);
+        executorService = Executors.newScheduledThreadPool(4);
         /*String url = "http://192.168.10.79:8919/fg/server/timestamp";
         executorService.execute(()-> {
                 HttpReqData httpReqData = new HttpReqData(url);
@@ -127,6 +129,10 @@
         CameraManager cm = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
         try {
             String cameraId = cm.getCameraIdList()[0];
+            CameraCharacteristics cameraCharacteristics = cm.getCameraCharacteristics(cameraId);
+            StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+            Range<Integer>[] availableFpsRanges = cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
+            rangeMin = availableFpsRanges[0];
             cm.openCamera(cameraId,mDeviceStateCallback,null);
         }catch (Exception e){
             e.printStackTrace();
@@ -184,7 +190,10 @@
             captureBuilder.addTarget(previewSurface);
 
             /*璁剧疆棰勮鐨勭晫闈�*/
-            //璁剧疆鑷姩瀵圭劍妯″紡
+            //璁剧疆甯х巼
+            captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
+                    rangeMin);
+            /*//璁剧疆鑷姩瀵圭劍妯″紡
             captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                     CaptureRequest.CONTROL_AF_MODE_AUTO);
             // 璁剧疆鑷姩鏇濆厜妯″紡
@@ -192,7 +201,7 @@
                     CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
             // 寮�濮嬪鐒�
             captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
-                    CameraMetadata.CONTROL_AF_TRIGGER_START);
+                    CameraMetadata.CONTROL_AF_TRIGGER_START);*/
             captureBuilder.set(CaptureRequest.JPEG_ORIENTATION,  90);
 
             mCaptureSession.setRepeatingRequest(captureBuilder.build(), null, mHandler);
@@ -240,7 +249,7 @@
     }
 
     public void createRecorderSession(){
-        //鍏抽棴棰勮,鍚姩褰曞儚鐩稿叧
+        //鍏抽棴棰勮璇锋眰,鍚姩褰曞儚鐩稿叧
         try {
             mCaptureSession.stopRepeating();
         }catch (Exception e){
@@ -256,6 +265,7 @@
         initRecorder();
         try{
             mMediaRecorder.prepare();
+            mMediaRecorder.start();
         }catch (Exception e){
             e.printStackTrace();
         }
@@ -270,19 +280,17 @@
                         recordRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
 
                         recordRequest.addTarget(previewSurface);
-//                        recordRequest.addTarget(mImageReader.getSurface());
                         recordRequest.addTarget(mMediaRecorder.getSurface());
 
                         mCaptureSession.setRepeatingRequest(recordRequest.build(), null, mHandler); // 寮�濮嬪綍鍒惰棰�
-                        mMediaRecorder.start();
-
                         //camera2 鎹曟崏瑙嗛蹇収,1绉掗挓1娆$殑瀹氭椂浠诲姟
                         CaptureRequest.Builder snapshotBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT);
                         snapshotBuilder.addTarget(surfaceForStream);
 
-                        executorService.scheduleAtFixedRate(() -> {
+                        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
+                        scheduledExecutorService.scheduleAtFixedRate(() -> {
                             try {
-                                session.capture(snapshotBuilder.build(), null, mHandler);
+                                session.capture(snapshotBuilder.build(), null, null);
                             }catch (Exception e){
                                 e.printStackTrace();
                             }
@@ -334,32 +342,33 @@
             Image image = reader.acquireNextImage();
             image.close();
         }*/
-        // 鑾峰彇鍒版媿鐓х殑鍥惧儚鏁版嵁
-        Image image = reader.acquireNextImage();
-        //杩欓噷鍙槸婕旂ずtest
-        llUpText.setVisibility(View.VISIBLE);
-        tvDevice.setText("杩欐槸娴嬭瘯鐨勫姩鎬佽祴鍊�");
-        // 鑾峰彇鍥剧墖鐨勫瓧鑺傛暟缁�
-        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
-        byte[] data = new byte[buffer.remaining()];
-        buffer.get(data);
-        // 淇濆瓨鍥剧墖鍒扮浉鍐�
-        saveImageToGallery(data);
-        // 閲婃斁鍥惧儚璧勬簮
-        image.close();
+            // 鑾峰彇鍒版媿鐓х殑鍥惧儚鏁版嵁
+            Image image = reader.acquireNextImage();
+            //杩欓噷鍙槸婕旂ずtest
+            llUpText.setVisibility(View.VISIBLE);
+            tvDevice.setText("杩欐槸娴嬭瘯鐨勫姩鎬佽祴鍊�");
+            // 淇濆瓨鍥剧墖鍒扮浉鍐�
+            executorService.execute(() -> {
+                saveImageToGallery(image);
+            });
+
     };
 
-    private void saveImageToGallery(byte[] data) {
+    private void saveImageToGallery(Image image) {
         // 瀹氫箟鍥剧墖鐨勪繚瀛樿矾寰勫拰鏂囦欢鍚�
         String fileName = "IMG_" + System.currentTimeMillis() + ".jpg";
         String filePath = Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).getAbsolutePath()  + "/yc_test"+ File.separator + fileName;
 
+        // 鑾峰彇鍥剧墖鐨勫瓧鑺傛暟缁�
+        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
+        byte[] data = new byte[buffer.remaining()];
+        buffer.get(data);
         // 鍒涘缓鏂囦欢杈撳嚭娴�
         try {
             FileOutputStream fos = new FileOutputStream(filePath);
             fos.write(data);
             fos.close();
-
+            image.close();
             // 閫氱煡鍥惧簱鏇存柊
             MediaScannerConnection.scanFile(mContext, new String[]{filePath}, null, null);
 
@@ -376,32 +385,29 @@
     }
 
     public void stopRecording() {
-       //杩欓噷鍙槸婕旂ずtest
-        llUpText.setVisibility(View.GONE);
-        //鍋滄鐢婚潰鍥剧墖鐩戝惉
-        mImageReader.close();
-        // 鍋滄褰曞埗瑙嗛
         try {
-            executorService.shutdownNow();
+            // 鍋滄褰曞埗瑙嗛,鍏抽棴褰曞儚璇锋眰
             mMediaRecorder.stop();
+            //鍏抽棴瀹氭椂瑙嗛蹇収
+            scheduledExecutorService.shutdownNow();
+            mCaptureSession.stopRepeating();
+            //鍋滄鐢婚潰鍥剧墖鐩戝惉
+            mImageReader.close();
+           //杩欓噷鍙槸婕旂ずtest
+            llUpText.setVisibility(View.GONE);
+            //鍚姩棰勮
             createPreviewSession();
-        } catch (IllegalStateException e) {
+        } catch (Exception e) {
             e.printStackTrace();
         } finally {
-//            mMediaRecorder.reset();
+            mMediaRecorder.reset();
 //            mMediaRecorder.release();
 //            mMediaRecorder = null;
+            //鍥惧簱鏇存柊
+            addToGallery(recorderPath);
+            isRecording = false;
         }
-        isRecording = false;
 
-        // 鍏抽棴鐩告満棰勮浼氳瘽
-        //        if (captureSession != null) {
-        //            captureSession.close();
-        //            captureSession = null;
-        //        }
-
-        //鍥惧簱鏇存柊
-        addToGallery(recorderPath);
     }
 
     private void addToGallery(String videoFilePath) {

--
Gitblit v1.9.1