媒体记录器(MediaRecorder)出现启动错误或非法状态(IllegalStateException)

8
我正在使用Android的Camera API和MediaRecorder来录制视频,但遇到了一个非常奇怪的问题。
    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
@global_warming 它每次都会抛出错误。 - Megha Maniar
我尝试了不同的音视频源和音视频编码器的组合,但每次都会出现相同的错误。 - Megha Maniar
你有按照这个指南进行操作吗?https://developer.android.com/guide/topics/media/camera.html#capture-video 看起来你需要先执行MediaRecorder.setCamera()。 - Jerome
2个回答

2
问题是您没有设置相机,使用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给你,因为我不知道在使用媒体记录器时我们必须解锁和释放相机。我从https://dev59.com/hOo6XIcBkEYKwwoYGwUw中得到了解决我的问题的方法。感谢你的努力。 - Megha Maniar

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

试一下,然后告诉我它是否有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接