我正在创建一个MediaRecorder并使用它来生成视频片段。它第一次完美运作。我通过将最大文件大小设置为5MB来结束视频拍摄过程,然后进入 onInfo 方法并完全按照特定视频拍摄。
现在我想要一个接一个地生成5个这样的片段。我将以下内容添加到onInfo方法中:
@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 是一个变量,用于为每个生成的视频片段指定一个不同的名称。
然而,在成功捕获第一个视频片段之后,在第二个片段开始录制之前,当我尝试再次启动录像机对象时遇到 IllegalStateException 。由于我使用 recorder.reset() API,我认为我可以重用 recorder 对象进行后续迭代。但它正在解决这个问题。
如何解决这个问题?重新初始化录像机对象后是否需要提供一些延迟?
编辑:如果我将 recorder.start()保留在按钮内,则可以正常工作,也就是说,每按一次按钮,都会拍摄一个单独的视频。但是,如果我要求它说,5个视频,只需点击一下按钮,应用程序就会在开始拍摄第二个视频之前崩溃,也就是说,它只能运行一次。如何克服这种不均匀性?
答案 0 :(得分:0)
在official documentation之前,您需要先调用setOutputFormat()方法,然后才能调用prepare(),如下所示:
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);