Android 如何重复使用同一记录器对象
我正在创建一个MediaRecorder并使用它生成视频剪辑。它第一次就完美地工作了。我通过将最大文件大小设置为5MB来结束视频拍摄过程,然后它进入onInfo方法,并完成特定的视频快照 现在我想生成5个这样的剪辑,一个接一个。为此,我将以下内容添加到onInfo方法中:Android 如何重复使用同一记录器对象,android,video,illegalstateexception,android-mediarecorder,Android,Video,Illegalstateexception,Android Mediarecorder,我正在创建一个MediaRecorder并使用它生成视频剪辑。它第一次就完美地工作了。我通过将最大文件大小设置为5MB来结束视频拍摄过程,然后它进入onInfo方法,并完成特定的视频快照 现在我想生成5个这样的剪辑,一个接一个。为此,我将以下内容添加到onInfo方法中: @Override public void onInfo(MediaRecorder mr, int what, int extra) { // TODO Auto-generated method s
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
// TODO Auto-generated method stub
//System.out.println("Reached onInfoListener");
if(what==android.media.MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED)
{
Toast.makeText(getApplicationContext(), "Video clip "+video_count+" recorded", Toast.LENGTH_SHORT).show();
recorder.stop(); //recorder is an object of type MediaRecorder
recorder.reset();
initRecorder(); //Reinitializing for subsequent video generation
prepareRecorder(); //Re preparing for subsequent video generation
}
}
private void initRecorder() {
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"/FOLDERNAME");
if(!dir.exists())
{
dir.mkdir();
}
CamcorderProfile cpHigh = CamcorderProfile
.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(cpHigh);
recorder.setOutputFile("/sdcard/FOLDERNAME/video"+video_count+".mp4");
recorder.setMaxDuration(50000); // 50 seconds
recorder.setMaxFileSize(5*1048576); // Approximately 5 megabytes
}
private void prepareRecorder() {
recorder.setPreviewDisplay(cameraView.getHolder().getSurface());
try {
recorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
finish();
} catch (IOException e) {
e.printStackTrace();
finish();
}
}
注意:videocount是一个变量,用于为每个生成的视频剪辑指定不同的名称
但是,在成功捕获第一个视频剪辑之后,就在第二个剪辑开始录制之前,当我再次尝试启动recorder对象时,遇到非法状态异常。因为我使用的是recorder.reset()API,所以我认为我可以在后续迭代中重用recorder对象。但它给了这个问题
如何解决这个问题?是否有必要在重新初始化记录器对象后提供一些延迟
编辑:如果我将recorder.start()放在一个按钮单击中,这会起作用,也就是说,每次单击按钮时,都会拍摄一个单独的视频。但是,如果我让它只需点击一个按钮就可以拍摄5个视频,那么应用程序在开始拍摄第二个视频之前就会崩溃,也就是说,它只能工作一次。如何克服这种不一致性?在调用prepare()之前,您需要调用setOutputFormat()方法,如下所示:
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);