checkAndUpdateEglState: неверный текущий EGLDisplay

#android #opengl-es-2.0 #android-camera2

Вопрос:

Я пытаюсь использовать Camera2 для записи видео с помощью MediaCodec.

Есть две части, которые я хочу завершить.
1.Используйте Camera2 для записи видео с помощью MediaCodec(успешно)
2.Используйте OpenGL для добавления текстовых меток в мой выходной файл mp4(ошибка)

вот ошибка msg

 2021-08-18 16:42:04.196 3820-3861/com.sample.Camera2 E/GLConsumer: [SurfaceTexture-1-3820-2] checkAndUpdateEglState: invalid current EGLDisplay
2021-08-18 16:42:04.204 3820-3861/com.sample.Camera2 E/AndroidRuntime: FATAL EXCEPTION: ImageListener
    Process: com.sample.Camera2_chiu, PID: 3820
    java.lang.IllegalStateException: Unable to update texture contents (see logcat for details)
        at android.graphics.SurfaceTexture.nativeUpdateTexImage(Native Method)
        at android.graphics.SurfaceTexture.updateTexImage(SurfaceTexture.java:243)
        at com.sample.Camera2.CameraConnectionFragment$SurfaceTextureManager.awaitNewImage(CameraConnectionFragment.java:1118)
        at com.sample.Camera2.CameraConnectionFragment$6.onConfigured(CameraConnectionFragment.java:936)
        at java.lang.reflect.Method.invoke(Native Method)
        at android.hardware.camera2.dispatch.InvokeDispatcher.dispatch(InvokeDispatcher.java:39)
        at android.hardware.camera2.dispatch.HandlerDispatcher$1.run(HandlerDispatcher.java:65)
 

Я использую mSurface, чтобы моя ЧАСТЬ 1 удалась, но я застрял в ЧАСТИ 2 из-за ошибки.

     private void prepareEncoder(int width, int height, int bitrate) throws IOException {
        mBufferInfo = new MediaCodec.BufferInfo();

        MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, width, height);

        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
        format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
        format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE);
        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);

        mEncoder = MediaCodec.createEncoderByType(MIME_TYPE);
        mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

        !!!!!---- 1.THE FIRST PART TO Recording---!!!!
        mSurface = mEncoder.createInputSurface();

        !!!!!---- 2.THE SECORD PART TO Build up the OpenGL(EGL Surface)
        /////mInputSurface = new CodecInputSurface(mSurface);
        mEncoder.start();
 

Вот моя функция записи (часть 2)

   public void startRecordingVideo() {
        //Get activity

        TextureView mTextureView = getTextureView(); 
        if (mCameraDevice == null || !mTextureView.isAvailable()) {
            return;
        }

        try {
            closePreviewSession();

            prepareEncoder(inputSize.getWidth(), inputSize.getHeight(), 1000000);
            mInputSurface.makeCurrent();

            prepareSurfaceTexture();

            SurfaceTexture AutoFitST = mTextureView.getSurfaceTexture();
            assert AutoFitST != null;
            AutoFitST.setDefaultBufferSize(640, 480);

            recordRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);

            Surface previewSurface = new Surface(AutoFitST);
            recordRequestBuilder.addTarget(previewSurface);

            Surface recorderSurface = new Surface(mStManager.getSurfaceTexture());
(Part 2)    recordRequestBuilder.addTarget(recorderSurface);

(Part 1)    //recordRequestBuilder.addTarget(mSurface);

            // Start a capture session
            // Once the session starts, we can update the UI and start recording
            mCameraDevice.createCaptureSession(
(Part 2)            Arrays.asList(previewSurface, recorderSurface),
                    new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {

                    mCaptureSession = cameraCaptureSession;

                    try {
                        // Finally, we start displaying the camera preview.
                        recordRequest = recordRequestBuilder.build();
                        mCaptureSession.setRepeatingRequest(
                                recordRequest, captureCallback, backgroundHandler);

                        Thread recording_th = new Thread(r_StartRecord);
                        recording_th.start();

                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                    Activity activity = getTextureViewContext();
                    if (null != activity) {
                        Toast.makeText(activity.getApplicationContext(), "Config Error", Toast.LENGTH_SHORT).show();
                    }
                }
            }, backgroundHandler);
        } catch (IOException | CameraAccessException e) {
            e.printStackTrace();
        }
    }
 

Возможно ли, что часть 2 mStManager.getSurfaceTexture не получает никаких данных Camera2 и вызвала ошибку msg?? Спасибо за помощь!