首页 > 解决方案 > MediaRecorder的android camera2 api问题

问题描述

我有一个奇怪的错误,即我的 CameraDevice.createCaptureSession 没有检测到我的 MediaRecorder Surface 的大小并放弃它。如果我禁用媒体记录器,该应用程序将正常工作。

源代码

        public void onOpened(CameraDevice camera) {

            SurfaceTexture texture = previewView.getSurfaceTexture();
            texture.setDefaultBufferSize(size.getWidth(), size.getHeight());
            Surface textureSurface = new Surface(texture);


            mCameraDevice = camera;
            mMediaRecorder = new MediaRecorder();
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            mMediaRecorder.setVideoSize(size.getWidth(), size.getHeight());
            mMediaRecorder.setOrientationHint(SENSOR_ORIENTATION_DEFAULT_DEGREES);
            mMediaRecorder.setPreviewDisplay(textureSurface);

            int rotation = ((Activity)context).getWindowManager().getDefaultDisplay().getRotation();
            switch (mSensorOrientation) {
                case SENSOR_ORIENTATION_DEFAULT_DEGREES:
                    mMediaRecorder.setOrientationHint(DEFAULT_ORIENTATIONS.get(rotation));
                    break;
                case SENSOR_ORIENTATION_INVERSE_DEGREES:
                    mMediaRecorder.setOrientationHint(INVERSE_ORIENTATIONS.get(rotation));
                    break;
            }

            try {
                mMediaRecorder.setOutputFile(getVideoFilePath());
                mMediaRecorder.prepare();
                Surface recorderSurface = mMediaRecorder.getSurface();
                List<Surface> list = new ArrayList<>();
                list.add(recorderSurface);
                final CaptureRequest.Builder captureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
                captureRequest.addTarget(recorderSurface);
                mCaptureRequest = captureRequest.build();
                mCameraDevice.createCaptureSession(list, captureStateCallback, backgroundHandler);

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

        }

堆栈跟踪

E/Legacy-CameraDevice-JNI:LegacyCameraDevice_nativeDetectSurfaceDimens:查询表面宽度时出错 没有这样的设备 (-19)。E/AndroidRuntime:致命异常:相机背景进程:me.wesferr.personalorganizer,PID:1987 java.lang.IllegalArgumentException:Surface 在 android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:89) 在 android .hardware.camera2.params.OutputConfiguration.(OutputConfiguration.java:260) 在 android.hardware.camera2.params.OutputConfiguration.(OutputConfiguration.java:145) 在 android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java :520) 在 me.wesferr.personalorganizer.CaptureVideoClass$1.onOpened(CaptureVideoClass.java:133) 在 android.hardware.camera2.impl.CameraDeviceImpl$1。 

标签: androidsizeandroid-camera2mediarecordersurface

解决方案


推荐阅读