whycxzp
2024-07-29 8769a20594326a1b60487d550aa616aa4277ba72
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();
@@ -300,6 +302,7 @@
        }
        // 提交数据给MediaCodec
        try {
        int inputBufferIndex = mMediaCodec.dequeueInputBuffer(0);
        if (inputBufferIndex >= 0) {
            ByteBuffer inputBuffer = mMediaCodec.getInputBuffer(inputBufferIndex);
@@ -318,16 +321,22 @@
                mMediaMuxer.start();
            }
        }
        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;
        }
    }