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