From 8769a20594326a1b60487d550aa616aa4277ba72 Mon Sep 17 00:00:00 2001
From: whycxzp <glperry@163.com>
Date: 星期一, 29 七月 2024 15:43:25 +0800
Subject: [PATCH] 更新

---
 app/src/main/java/com/whyc/widget/Camera2TextureView4.java |   70 ++++++++++++++++++++---------------
 1 files changed, 40 insertions(+), 30 deletions(-)

diff --git a/app/src/main/java/com/whyc/widget/Camera2TextureView4.java b/app/src/main/java/com/whyc/widget/Camera2TextureView4.java
index f7c46cc..c593d08 100644
--- a/app/src/main/java/com/whyc/widget/Camera2TextureView4.java
+++ b/app/src/main/java/com/whyc/widget/Camera2TextureView4.java
@@ -42,7 +42,6 @@
 
 /**
  * 杩欎釜閲囩敤ImageReader瑙嗛甯ф潵鑾峰彇瑙嗛鍜屽鐞嗗浘鐗�
- * TODO 鍏抽棴褰曞儚鍑虹幇mMediaMuxer 寮傚父
  * */
 public class Camera2TextureView4 extends TextureView {
 
@@ -194,6 +193,9 @@
     private void startPreview() {
         //鍚姩棰勮
         try {
+            if(previewThreadHandler == null){
+                initPreviewThreadHandler();
+            }
             mCaptureSession.setRepeatingRequest(previewCaptureBuilder.build(), null, previewThreadHandler);
         } catch (CameraAccessException e) {
             e.printStackTrace();
@@ -284,14 +286,14 @@
         byte[] nv12 = new byte[I420size];
         byte[] nv21 = new byte[I420size];
 
-        YUVUtil.YUVToNV21_NV12(image,nv12,videoWidth,videoHeight,"NV12");
+        YUVUtil.YUVToNV21_NV12(image, nv12, videoWidth, videoHeight, "NV12");
         long now = image.getTimestamp();
         image.close();
         //鍥剧墖鎴浘
         SharedPreferences camera2Time = mContext.getSharedPreferences("camera2Time", Context.MODE_PRIVATE);
         long lastTime = camera2Time.getLong("time", 0);
         long secondsGap = (now - lastTime) / 1000000000;
-        if (lastTime == 0  || secondsGap > 2) {
+        if (lastTime == 0 || secondsGap > 2) {
             camera2Time.edit().putLong("time", now).apply();
             //闇�瑕佸皢nv12杞寲涓簄v21鍚庤繘琛屽浘鐗囧瓨鍌�
             nv21 = convertNV12toNV21(nv12);
@@ -300,34 +302,41 @@
         }
 
         // 鎻愪氦鏁版嵁缁橫ediaCodec
-        int inputBufferIndex = mMediaCodec.dequeueInputBuffer(0);
-        if (inputBufferIndex >= 0) {
-            ByteBuffer inputBuffer = mMediaCodec.getInputBuffer(inputBufferIndex);
-            inputBuffer.clear();
-            inputBuffer.put(nv12);
-            long nanoTime = System.nanoTime();
-            long presentationTimeUs = nanoTime / 1000; // 灏嗙撼绉掕浆鎹负寰
-            mMediaCodec.queueInputBuffer(inputBufferIndex, 0, nv12.length, presentationTimeUs, 0);
-        }
-        // 鑾峰彇缂栫爜鍚庣殑鏁版嵁姹囧叆H264 灏佽鎴恗p4
-        MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
-        int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
-        if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
-            mVideoTrackIndex = mMediaMuxer.addTrack(mMediaCodec.getOutputFormat());
-            if(mVideoTrackIndex != -1){
-                mMediaMuxer.start();
+        try {
+            int inputBufferIndex = mMediaCodec.dequeueInputBuffer(0);
+            if (inputBufferIndex >= 0) {
+                ByteBuffer inputBuffer = mMediaCodec.getInputBuffer(inputBufferIndex);
+                inputBuffer.clear();
+                inputBuffer.put(nv12);
+                long nanoTime = System.nanoTime();
+                long presentationTimeUs = nanoTime / 1000; // 灏嗙撼绉掕浆鎹负寰
+                mMediaCodec.queueInputBuffer(inputBufferIndex, 0, nv12.length, presentationTimeUs, 0);
             }
-        }
-        while (outputBufferIndex >=0){
-            ByteBuffer outputBuffer = mMediaCodec.getOutputBuffer(outputBufferIndex);
-            if (mVideoTrackIndex != -1) {
-                mMediaMuxer.writeSampleData(mVideoTrackIndex, outputBuffer, bufferInfo);
+            // 鑾峰彇缂栫爜鍚庣殑鏁版嵁姹囧叆H264 灏佽鎴恗p4
+            MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
+            int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
+            if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+                mVideoTrackIndex = mMediaMuxer.addTrack(mMediaCodec.getOutputFormat());
+                if (mVideoTrackIndex != -1) {
+                    mMediaMuxer.start();
+                }
             }
-            mMediaCodec.releaseOutputBuffer(outputBufferIndex, false);
-            outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
-            if((bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) !=0){
-                break;
+
+            while (outputBufferIndex >= 0) {
+                ByteBuffer outputBuffer = mMediaCodec.getOutputBuffer(outputBufferIndex);
+                if (mVideoTrackIndex != -1) {
+
+                    mMediaMuxer.writeSampleData(mVideoTrackIndex, outputBuffer, bufferInfo);
+
+                    mMediaCodec.releaseOutputBuffer(outputBufferIndex, false);
+                    outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
+                    if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                        break;
+                    }
+                }
             }
+        } catch (Exception e) {
+            //涓柇閿欒,蹇界暐
         }
 
     };
@@ -434,10 +443,11 @@
         try {
             previewThread.quitSafely();
             previewThread.join();
-            previewThread = null;
-            previewThreadHandler = null;
         } catch (InterruptedException e) {
             e.printStackTrace();
+        }finally {
+            previewThread = null;
+            previewThreadHandler = null;
         }
     }
 

--
Gitblit v1.9.1