android - CameraX - 在录制视频时在 onPause() 上崩溃应用程序

标签 android android-camera2 android-camerax android-mediacodec

如果在录制视频时最小化应用程序 - 一切正常,但是一旦我部署应用程序,就会收到此错误:

E/AndroidRuntime: FATAL EXCEPTION: CameraX-video encoding thread
Process: <pkgname>, PID: 12340
java.lang.IllegalStateException
    at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)
    at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:2698)
    at androidx.camera.core.VideoCapture.videoEncode(VideoCapture.java:604)
    at androidx.camera.core.VideoCapture$2.run(VideoCapture.java:348)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:214)
    at android.os.HandlerThread.run(HandlerThread.java:65)

或者 如果我在 onPause videoCapture?.stopRecording() 时停止录制,则会出现此错误:

E/AndroidRuntime: FATAL EXCEPTION: CameraX-
Process: <pkgname>, PID: 9489
java.lang.IllegalStateException
    at androidx.core.util.Preconditions.checkState(Preconditions.java:96)
    at androidx.core.util.Preconditions.checkState(Preconditions.java:108)
    at androidx.camera.camera2.impl.Camera.openCaptureSession(Camera.java:874)
    at androidx.camera.camera2.impl.Camera.onUseCaseReset(Camera.java:625)
    at androidx.camera.camera2.impl.Camera$11.run(Camera.java:611)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:214)
    at android.os.HandlerThread.run(HandlerThread.java:65)

如何在最小化应用程序时正确停止录制视频???

这是我的代码: 我收集配置:

CameraX.unbindAll()
    getDisplayMetrics()
    setPreviewConfig()

    when (typeCapture) {
        TYPE_IMAGE -> {
            setImageCapture()
            CameraX.bindToLifecycle(this, preview, imageCapture)
        }
        TYPE_VIDEO -> {
            setVideoCapture()
            CameraX.bindToLifecycle(this, preview, videoCapture)
        }
    }

设置videoConfig和videoCapture:

val videoCaptureConfig = VideoCaptureConfig.Builder().apply {
        setLensFacing(lensFacing)
        setTargetAspectRatioCustom(screenAspectRatio)
        setTargetRotation(rotation)
    }.build()

    videoCapture = VideoCapture(videoCaptureConfig)

然后我开始录制视频:

videoCapture?.startRecording(videoFile, 
CameraXExecutors.mainThreadExecutor(), recordListener)

在 onPause() 上我得到的错误如上所述

谢谢

最佳答案

我在 onPause 时停止视频时遇到了同样的错误。为了解决这个问题,我在调用 super.onPause() 之前添加了一个延迟(参见:android: camera onPause/onResume issue)。

  1. 声明videoSavedListener
private VideoCapture.OnVideoSavedListener videoSavedListener= new VideoCapture.OnVideoSavedListener() {
    @Override
    public void onVideoSaved(@NonNull File file) {
        if(isRecording) {
            isRecording = false;
            // Do whatever you want
        }
    }

    @Override
    public void onError(@NonNull VideoCapture.VideoCaptureError videoCaptureError, @NonNull String message, @Nullable Throwable cause) {

    }
};
  1. 添加onClickListener
button.setOnClickListener(v -> {
    if(!isRecording){
        videoCapture.startRecording(videoFile, CameraXExecutors.mainThreadExecutor(), videoSavedListener);
        isRecording = true;
     }else{
        videoCapture.stopRecording();
     }
});
  1. 覆盖 onPause()
    @SuppressLint("RestrictedApi")
    @Override
    public void onPause() {
        if(isRecording){
            isRecording = false;
            videoCapture.stopRecording();

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            super.onPause();
        }else
            super.onPause();
    }

Please note that video recording use case is currently marked as hidden in the API and is in a very preliminary state and subject to change.

编辑:对于某些设备,在使用 videoCapture 用例集调用 onPause() 时,应用程序仍然会崩溃。我添加了 CameraX.unbindAll() 以在调用 super.onPause() 之前删除所有用例。然后,在 onResume() 方法中我再次绑定(bind)它们。

关于android - CameraX - 在录制视频时在 onPause() 上崩溃应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59088142/

相关文章:

android - 适用于 Android 的 Visual Studio 模拟器无法正常工作

android - 跨进程共享状态变量

android - 如何在 Camera2 API Android 中捕获叠加层内的图像?

android - 配置 CameraX(闪光模式、自动白平衡模式、 Action 模式等)

android - 如果为其他应用授予 REQUEST_INSTALL_PACKAGES 权限,则无法检索

android - 完全停止或重新启动 Android 应用程序中的所有 Activity 以反射(reflect)新的语言选择

安卓 Camera2 API : Capture video without preview

Android Camera2帧水平反转

java - 如何在 CameraX 预览上设置一个框,以便使用 Java 中的 ImageAnalysis 对其进行处理?

android - 如何在 MediaCodec 编码器和 CameraX 之间共享 Surface