MediaRecorder给出了启动错误或IllegalStateException

时间:2018-03-23 11:32:22

标签: android mediarecorder camera-api

我正在使用MediaRecorder通过Android的Camera API录制视频。我遇到了一个非常奇怪的问题。

    private void startRecordingVideo() {
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
    File file = getAlbumDir();
    recorder.setOutputFile(file.getAbsolutePath());
    recorder.setMaxDuration(50000);
    recorder.setMaxFileSize(5000000);
    recorder.setPreviewDisplay(CameraBridgeViewBase.surfaceHolder.getSurface());
    try {
        recorder.prepare();
        recorder.start();
    } catch (IllegalStateException | IOException e) {
        e.printStackTrace();
    }     
}

现在这给了我 MediaRecorder:开始失败:-19 错误。我已经检查了thisthis个链接,这些链接表示要删除mediaRecorder.setVideoSize(sView.getWidth(), sView.getHeight());,但我没有使用setVideoSize(sView.getWidth(), sView.getHeight())。通过尝试和错误,我发现如果我删除编码器recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);应用程序不会崩溃,但会给出新的异常:

03-23 16:50:06.213 28226-28226/com.scenera.android.surveillance E/MediaRecorder: audio source is set, but audio encoder is not set

我不明白我在这里做错了什么。任何帮助都会得到满足。提前谢谢。

2 个答案:

答案 0 :(得分:2)

问题是您没有设置相机,使用Camera 1 API,您应首先打开相机,然后将其解锁并将其设置为录像机。只有在那之后你才能继续配置MediaRecorder recorder = new MediaRecorder(); Camera camera = Camera.open(); camera.unlock(); recorder.setCamera(camera); recorder.setPreviewDisplay(surfaceHolder.getSurface()); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); File file = getAlbumDir(); recorder.setOutputFile(file.getAbsolutePath()); recorder.setMaxDuration(50000); recorder.setMaxFileSize(5000000); try { recorder.prepare(); recorder.start(); } catch (IllegalStateException | IOException e) { e.printStackTrace(); } (这是一篇非常精美的API文章)

../node_modules/bootstrap/dist/css/bootstrap.css

答案 1 :(得分:0)

  boolean mStartRecording=false;

首先在活动中创建此变量 然后尝试下面的代码

if( recorder == null ) {
        recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        File file = getAlbumDir();
        recorder.setOutputFile(file.getAbsolutePath());
        recorder.setMaxDuration(50000);
        recorder.setMaxFileSize(5000000);
        recorder.setPreviewDisplay(CameraBridgeViewBase.surfaceHolder.getSurface());
    }
    if(!mStartRecording) {
        try {
            recorder.prepare();
            recorder.start();
            mStartRecording = true;
        }  catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        mStartRecording = false;
        recorder.stop();
        recorder.reset();
        recorder.release();
        recorder = null;
    }

尝试这个,让我知道它是否有效。