Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用摄像机2进行录像_Java_Android_Android Camera2_Mediarecorder - Fatal编程技术网

Java 使用摄像机2进行录像

Java 使用摄像机2进行录像,java,android,android-camera2,mediarecorder,Java,Android,Android Camera2,Mediarecorder,我正在尝试使用media recorder和camera2录制视频,但一旦遇到mediarecorder.start()函数,应用程序就会崩溃。在oncreate中,首先调用prepareCamera,然后调用trigger。我对camera2有点陌生。有谁能帮我找出为什么会这样 public void prepareCamera() throws CameraAccessException { manager = (CameraManager) getSystemService(CA

我正在尝试使用media recorder和camera2录制视频,但一旦遇到
mediarecorder.start()
函数,应用程序就会崩溃。在
oncreate
中,首先调用
prepareCamera
,然后调用
trigger
。我对camera2有点陌生。有谁能帮我找出为什么会这样

 public void prepareCamera() throws CameraAccessException {
    manager = (CameraManager) getSystemService(CAMERA_SERVICE);
    String[] cameras = manager.getCameraIdList();
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        Log.v("mycontroller","permission not granted");
        return;
    }
    Log.v("mycontroller","permission granted "+cameras[0]);
    manager.openCamera(cameras[0], new CameraDevice.StateCallback(){
        @Override
        public void onOpened(CameraDevice camera) {
            Log.v("mycontroller","camera opened");
            mCamera2 = camera;
            mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
            try {
                mediaRecorder.setOutputFile(createFile().getAbsolutePath());
                mediaRecorder.prepare();
                Log.v("mycontroller","recorder prepared");
                List<Surface> list = new ArrayList<>();
                list.add(mediaRecorder.getSurface());
                final CaptureRequest.Builder captureRequest = mCamera2.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
                captureRequest.addTarget(mediaRecorder.getSurface());
                mCaptureRequest = captureRequest.build();
                mCamera2.createCaptureSession(list, new CameraCaptureSession.StateCallback(){
                    @Override
                    public void onConfigured(CameraCaptureSession session) {
                        mSession = session;
                    }

                    @Override
                    public void onConfigureFailed(CameraCaptureSession session) {
                        mSession = session;
                    }
                }, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onDisconnected(CameraDevice camera) {}
        @Override
        public void onError(CameraDevice camera, int error) {}
    }, null);
}
public void trigger() {
    try {
            mediaRecorder.start();
            mSession.setRepeatingRequest(mCaptureRequest,
                    new CameraCaptureSession.CaptureCallback() {
                        @Override
                        public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber) {
                            Log.v("mycontroller","camera started capturing");
                            super.onCaptureStarted(session, request, timestamp, frameNumber);
                        }
                        @Override
                        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                            Log.v("mycontroller","camera stoped capturing");
                            super.onCaptureCompleted(session, request, result);
                        }
                    }, null);
    } catch (CameraAccessException e) {
        Log.v("mycontroller",e.getMessage());
        e.printStackTrace();
    }
}

private void releaseMediaRecorder() throws CameraAccessException {
    mSession.stopRepeating();
    try {
        mediaRecorder.stop();
        mediaRecorder.reset();
        mediaRecorder.release();
    }
    catch (Exception e){}
    mediaRecorder= null;
    mCamera2=null;
}
public void prepareCamera()引发CameraAccessException{
manager=(CameraManager)getSystemService(CAMERA_服务);
String[]cameras=manager.getCameraIdList();
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!=PackageManager.permission\u已授予){
Log.v(“mycontroller”,“未授予许可”);
返回;
}
Log.v(“mycontroller”、“已授予权限”+摄像头[0]);
manager.openCamera(cameras[0],新的camerradevice.StateCallback(){
@凌驾
打开公共空间(摄像头副摄像头){
Log.v(“mycontroller”,“摄像头打开”);
mCamera2=摄像机;
mediaRecorder.setVideoSource(mediaRecorder.VideoSource.SURFACE);
setOutputFormat(mediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncoder(mediaRecorder.VideoEncoder.MPEG_4_SP);
试一试{
setOutputFile(createFile().getAbsolutePath());
mediaRecorder.prepare();
Log.v(“我的控制器”、“准备好的记录器”);
列表=新的ArrayList();
添加(mediaRecorder.getSurface());
final CaptureRequest.Builder CaptureRequest=mCamera2.createCaptureRequest(CameraDevice.TEMPLATE_记录);
addTarget(mediaRecorder.getSurface());
mCaptureRequest=captureRequest.build();
mCamera2.createCaptureSession(列表,新的CameraCaptureSession.StateCallback(){
@凌驾
未配置公共void(CameraCaptureSession会话){
mSession=会话;
}
@凌驾
配置文件的公共无效(CameraCaptureSession){
mSession=会话;
}
},空);
}捕获(例外e){
e、 printStackTrace();
}
}
@凌驾
已断开连接的公共无效(摄像头设备摄像头){}
@凌驾
public void onError(CameraDevice camera,int error){}
},空);
}
公共无效触发器(){
试一试{
mediaRecorder.start();
mSession.setRepeatingRequest(mCaptureRequest,
新建CameraCaptureSession.CaptureCallback(){
@凌驾
public void onCaptureStarted(CameraCaptureSession会话、CaptureRequest请求、长时间戳、长帧号){
Log.v(“mycontroller”,“摄像头开始抓拍”);
super.onCaptureStarted(会话、请求、时间戳、帧号);
}
@凌驾
捕获完成后的公共void(CameraCaptureSession会话、CaptureRequest请求、TotalCaptureResult){
Log.v(“mycontroller”,“摄像头停止捕捉”);
super.onCaptureCompleted(会话、请求、结果);
}
},空);
}捕获(CameraAccessE异常){
Log.v(“mycontroller”,e.getMessage());
e、 printStackTrace();
}
}
私有void releaseMediaRecorder()引发CameraAccessException{
mSession.stopRepeating();
试一试{
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
}
捕获(例外e){}
mediaRecorder=null;
mCamera2=null;
}

看看Google的Camera2Video示例,看看您的代码与示例之间是否存在任何关键差异:

您可能需要设置更多MediaRecorder设置,如分辨率;通常,这个类很容易做到这一点