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