Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何重复使用同一记录器对象_Android_Video_Illegalstateexception_Android Mediarecorder - Fatal编程技术网

Android 如何重复使用同一记录器对象

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

我正在创建一个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是一个变量,用于为每个生成的视频剪辑指定不同的名称

但是,在成功捕获第一个视频剪辑之后,就在第二个剪辑开始录制之前,当我再次尝试启动recorder对象时,遇到非法状态异常。因为我使用的是recorder.reset()API,所以我认为我可以在后续迭代中重用recorder对象。但它给了这个问题

如何解决这个问题?是否有必要在重新初始化记录器对象后提供一些延迟

编辑:如果我将recorder.start()放在一个按钮单击中,这会起作用,也就是说,每次单击按钮时,都会拍摄一个单独的视频。但是,如果我让它只需点击一个按钮就可以拍摄5个视频,那么应用程序在开始拍摄第二个视频之前就会崩溃,也就是说,它只能工作一次。如何克服这种不一致性?

在调用prepare()之前,您需要调用setOutputFormat()方法,如下所示:

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);