【问题标题】:MediaRecorder gives start error or IllegalStateExceptionMediaRecorder 给出启动错误或 IllegalStateException
【发布时间】:2018-09-02 01:46:38
【问题描述】:

我正在使用 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: start failed: -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

我不明白我在这里做错了什么。任何帮助都将不胜感激。提前致谢。

【问题讨论】:

  • 这段代码是否可以在任何设备上运行或每次都抛出错误?
  • @global_warming 每次都会抛出错误。
  • 我尝试了不同的音频/视频源和音频/视频编码器组合,但每次都给出相同的错误。
  • 您是否遵循本指南? developer.android.com/guide/topics/media/… 看来你需要先做一个 MediaRecorder.setCamera()。

标签: android mediarecorder camera-api


【解决方案1】:

问题是您没有设置相机,使用 Camera 1 API 您应该先打开相机,然后将其解锁并设置到录像机。只有在那之后你才能继续配置MediaRecorder(顺便说一句,这是一段写得很漂亮的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();
}

【讨论】:

  • 你的答案肯定是正确的,但我一直在寻找的是录制由 openCV 库检测到的运动视频。为此,我需要将SURFACE 作为视频源传递。在这里 +1 给你,因为我不知道我们在使用媒体记录器时必须解锁和释放相机。我从stackoverflow.com/questions/28663864/… 得到了我的问题的解决方案。感谢您的努力。
【解决方案2】:
  boolean mStartRecording=false;

首先在activity中创建这个变量 稍后尝试下面的代码

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;
    }

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

【讨论】:

    猜你喜欢
    • 2015-07-30
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多