MediaRecoder.stop() 耗时过长
MediaRecoder.stop() take too long time
当我使用 MediaRecorder 录制完视频后,函数 stop() 花了很长时间才关闭文件流,我的代码怎么了?
我已经尝试重置关于MediaRecorder的所有配置,我已经检查了框架代码,原生功能停止也需要很长时间,但是当我使用其他相机时,例如"OpenCamera" , 停止录制需要很短的时间。另外我检查了项目 "OpenCamera" 代码,并复制了它关于 MediaRecoder 的配置,它对我不起作用。
这是我关于启动和停止的代码。
public void startRecord(String path) {
if (currentState.compareTo(State.previewing) == 0) {
this.mediaPath = path;
currentState = State.recording;
mediaRecorder = new MediaRecorder();
mCamera.unlock();
mediaRecorder.setCamera(mCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoSize(videoSize.width, videoSize.height);
mediaRecorder.setOrientationHint(videoRotation);
mediaRecorder.setOutputFile(path);
File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() + "/DCIM/Camera");
if (!file.exists()) {
file.mkdirs();
}
try {
mediaRecorder.prepare();
mediaRecorder.start();
audioManager.requestAudioFocus(audioChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
} catch (Exception e) {
LogTool.e(this, "error !!!", e);
mCamera.lock();
clearException(path);
if (cameraCallback != null) {
cameraCallback.onRecordError();
}
}
}
}
public void stopRecord(boolean force) {
if (currentState.compareTo(State.recording) == 0) {
audioManager.abandonAudioFocus(audioChangeListener);
currentState = force ? State.previewing : State.showing;
if (mediaRecorder != null) {
try {
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
mediaRecorder = null;
} catch (Exception e) {
clearException(mediaPath);
if (!force) {
Toast.makeText(mContext, mContext.getResources().getString(R.string.video_tool_short),
Toast.LENGTH_SHORT).show();
}
if (cameraCallback != null) {
cameraCallback.onRecordError();
}
return;
}
if (force) {
File errorFile = new File(mediaPath);
if (errorFile.exists()) {
errorFile.delete();
}
if (cameraCallback != null) {
cameraCallback.onRecordError();
}
} else {
if (cameraCallback != null) {
cameraCallback.onMediaSaved(mediaPath);
}
}
}
}
}
那里显示了关于框架的日志:
01-01 13:32:08.650 4129-4129/? D/MediaRecorder: start begin
01-01 13:32:09.150 4129-4129/? D/MediaRecorder: start end
01-01 13:32:12.620 4129-4129/? D/MediaRecorder: stop start
01-01 13:32:17.770 4129-4129/? D/MediaRecorder: stop end
您可以看到系统日志显示需要 5 秒才能停止。
可能是设备错误。当我设置 setRecordingHint(true) 时,它帮我解决了这个问题。
当我使用 MediaRecorder 录制完视频后,函数 stop() 花了很长时间才关闭文件流,我的代码怎么了?
我已经尝试重置关于MediaRecorder的所有配置,我已经检查了框架代码,原生功能停止也需要很长时间,但是当我使用其他相机时,例如"OpenCamera" , 停止录制需要很短的时间。另外我检查了项目 "OpenCamera" 代码,并复制了它关于 MediaRecoder 的配置,它对我不起作用。
这是我关于启动和停止的代码。
public void startRecord(String path) {
if (currentState.compareTo(State.previewing) == 0) {
this.mediaPath = path;
currentState = State.recording;
mediaRecorder = new MediaRecorder();
mCamera.unlock();
mediaRecorder.setCamera(mCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoSize(videoSize.width, videoSize.height);
mediaRecorder.setOrientationHint(videoRotation);
mediaRecorder.setOutputFile(path);
File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() + "/DCIM/Camera");
if (!file.exists()) {
file.mkdirs();
}
try {
mediaRecorder.prepare();
mediaRecorder.start();
audioManager.requestAudioFocus(audioChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
} catch (Exception e) {
LogTool.e(this, "error !!!", e);
mCamera.lock();
clearException(path);
if (cameraCallback != null) {
cameraCallback.onRecordError();
}
}
}
}
public void stopRecord(boolean force) {
if (currentState.compareTo(State.recording) == 0) {
audioManager.abandonAudioFocus(audioChangeListener);
currentState = force ? State.previewing : State.showing;
if (mediaRecorder != null) {
try {
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
mediaRecorder = null;
} catch (Exception e) {
clearException(mediaPath);
if (!force) {
Toast.makeText(mContext, mContext.getResources().getString(R.string.video_tool_short),
Toast.LENGTH_SHORT).show();
}
if (cameraCallback != null) {
cameraCallback.onRecordError();
}
return;
}
if (force) {
File errorFile = new File(mediaPath);
if (errorFile.exists()) {
errorFile.delete();
}
if (cameraCallback != null) {
cameraCallback.onRecordError();
}
} else {
if (cameraCallback != null) {
cameraCallback.onMediaSaved(mediaPath);
}
}
}
}
}
那里显示了关于框架的日志:
01-01 13:32:08.650 4129-4129/? D/MediaRecorder: start begin
01-01 13:32:09.150 4129-4129/? D/MediaRecorder: start end
01-01 13:32:12.620 4129-4129/? D/MediaRecorder: stop start
01-01 13:32:17.770 4129-4129/? D/MediaRecorder: stop end
您可以看到系统日志显示需要 5 秒才能停止。
可能是设备错误。当我设置 setRecordingHint(true) 时,它帮我解决了这个问题。