如何解决使用摄像头 2 录制视频
我正在尝试使用媒体录像机和摄像头 2 录制视频,但一旦遇到 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,TotalCaptureResult result) {
Log.v("mycontroller","camera stoped capturing");
super.onCaptureCompleted(session,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;
}
解决方法
查看 Google 的 Camera2Video 示例,看看您是否能找到您的代码和示例之间的任何重要差异:
您可能需要设置更多的 MediaRecorder 设置,例如分辨率;通常使用 CamcorderProfile 类很容易做到这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。