java - 使用相机 2 录制视频
问题描述
我正在尝试使用媒体记录器和 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;
}
解决方案
查看 Google 的 Camera2Video 示例,看看您是否可以找到代码和示例之间的任何关键差异:
您可能需要设置更多 MediaRecorder 设置,例如分辨率;通常使用CamcorderProfile类很容易做到这一点。
推荐阅读
- graphql - 处理 GraphQL 查询时如何从服务中收集和返回警告?
- autodesk-forge - Autodesk 从孩子那里获取骨灰盒数据
- android - 为什么 Android 绑定的服务会在 Fragments 之后加载?
- reactjs - react-error-overlay 给出和错误如何解决这个问题
- python - 操作顺序 Django 模板
- ansible - vars 中的 Ansible 变量操作
- arrays - 如何将 API 对象转换为数组
- excel - 执行每个循环后 VBA 清除剪贴板
- nuxt.js - 如何正确使用带有 Nuxt.js 路由器的堆分析?
- c++ - 涉及 c++20 概念时 gcc 和 clang 之间的行为不一致