Java 使用摄像机2进行录像
我正在尝试使用media recorder和camera2录制视频,但一旦遇到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
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设置,如分辨率;通常,这个类很容易做到这一点