Android 视频录制 - mediaRecorder.start 上的 IllegalStateException
Android video recording - IllegalStateException on mediaRecorder.start
我正在学习 https://developer.android.com/guide/topics/media/camera.html#capture-video
上的教程
因此,我在尝试启动相机时遵循以下顺序:
- Camera.open
- camera.unlock
- mediaRecorder.setCamera
- mediaRecorder.setAudioSource
- mediaRecorder.setVideoSource
- mediaRecorder.setProfile
- mediaRecorder.setOutputFile
- mediaRecorder.prepare
- mediaRecorder.start <- 这是我得到 IllegalStateException
的地方
我可以找出可能出了什么问题,因为我正在按照指南 运行 5.0.2
private Camera mCamera;
private MediaRecorder mMediaRecorder;
public CameraActivity() {
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
}
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open();
}
catch (Exception e) { ... }
return c;
}
public void startRecording() {
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
try {
mMediaRecorder.prepare();
}
catch (IOException e) { ... }
catch (IllegalStateException e) { ... }
try {
mMediaRecorder.start();
}
catch (Exception e) {
Log.d(TAG, "exception on mediaRecorder.start" + e.toString()); // This is the exception that gets thrown on .start
}
}
我的清单包含所有必要的权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.microphone" />
我也试过手动设置格式而不是使用 .setProfile,结果相同
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
更新
该文件确实已创建,尽管它当然无法播放,所以我知道它一直在工作。对 prepare 的调用不会抛出异常,并且发生在开始之前。在 start()
上抛出相同的异常
再次比较我的代码,您似乎缺少两个调用:
mediaRecorder.setVideoSize(int width, int height)
mediaRecorder.setPreviewDisplay(SurfaceHolder surfaceHolder)
后者最有可能导致崩溃,因为 Android 需要有效的预览表面才能开始录制。这样做是为了防止隐藏摄像头应用程序。
有几十个与没有预览表面的录制相关的问题,但是这个 one 似乎总结了绕过这个限制你需要做的事情。
基本思想是将表面大小调整为 1x1 并将其传递给 mediaRecorder
实例。请记住,这可能不适用于所有设备。
如果您多次访问麦克风硬件,例如,同时使用 MediaRecorder 和 AudioRecord 类 也会出现此异常。
我正在学习 https://developer.android.com/guide/topics/media/camera.html#capture-video
上的教程因此,我在尝试启动相机时遵循以下顺序:
- Camera.open
- camera.unlock
- mediaRecorder.setCamera
- mediaRecorder.setAudioSource
- mediaRecorder.setVideoSource
- mediaRecorder.setProfile
- mediaRecorder.setOutputFile
- mediaRecorder.prepare
- mediaRecorder.start <- 这是我得到 IllegalStateException 的地方
我可以找出可能出了什么问题,因为我正在按照指南 运行 5.0.2
private Camera mCamera;
private MediaRecorder mMediaRecorder;
public CameraActivity() {
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
}
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open();
}
catch (Exception e) { ... }
return c;
}
public void startRecording() {
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
try {
mMediaRecorder.prepare();
}
catch (IOException e) { ... }
catch (IllegalStateException e) { ... }
try {
mMediaRecorder.start();
}
catch (Exception e) {
Log.d(TAG, "exception on mediaRecorder.start" + e.toString()); // This is the exception that gets thrown on .start
}
}
我的清单包含所有必要的权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.microphone" />
我也试过手动设置格式而不是使用 .setProfile,结果相同
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
更新
该文件确实已创建,尽管它当然无法播放,所以我知道它一直在工作。对 prepare 的调用不会抛出异常,并且发生在开始之前。在 start()
上抛出相同的异常再次比较我的代码,您似乎缺少两个调用:
mediaRecorder.setVideoSize(int width, int height)
mediaRecorder.setPreviewDisplay(SurfaceHolder surfaceHolder)
后者最有可能导致崩溃,因为 Android 需要有效的预览表面才能开始录制。这样做是为了防止隐藏摄像头应用程序。
有几十个与没有预览表面的录制相关的问题,但是这个 one 似乎总结了绕过这个限制你需要做的事情。
基本思想是将表面大小调整为 1x1 并将其传递给 mediaRecorder
实例。请记住,这可能不适用于所有设备。
如果您多次访问麦克风硬件,例如,同时使用 MediaRecorder 和 AudioRecord 类 也会出现此异常。