媒体录制器准备失败:Nougat为-2147483648

4

我正在编写一个通过surface录制摄像头视频的应用程序。

以下代码是为了准备MediaRecorder。

MediaRecorder mediaRecorder;
mediaRecorder = new MediaRecorder();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mediaRecorder.setOutputFile(videoFilename);
        mediaRecorder.setVideoEncodingBitRate(1000000);
        mediaRecorder.setVideoFrameRate(30);
        mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight());
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        try {
            mediaRecorder.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }

获取outfile(视频文件名)的方法如下:
File defaultExternalFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File videoFolder = new File(defaultExternalFolder, "My-Vids");
    if (!videoFolder.exists()) {
        videoFolder.mkdir();
    }

String timestemp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String prepend = "MyVid_" + timestemp + "_";
File videoFile = File.createTempFile(prepend, ".mp4", videoFolder);
videoFilename = videoFile.getAbsolutePath();
return videoFile;

videoSize是一个对象大小类。

当我尝试启动MediaRecorder时,出现了 java.io.IOException: prepare failed. 的错误。

奇怪的是,这只会在Nougat操作系统中崩溃,在其他设备上它能正常工作。


你找到解决方案了吗?我也遇到了完全相同的问题。它只在Nougat上失败。 - ram
我还没有找到任何解决方案。 - Alok Patel
2个回答

3

我猜测你正在模拟器上运行此代码。实际上,MediaRecorder不支持在模拟器上使用。 请参考:MediaRecorder

注意:目前,MediaRecorder在模拟器上无法正常工作。

好的,您可以通过注释麦克风配置来测试它,这样您会发现它可以工作。

MediaRecorder mediaRecorder;
mediaRecorder = new MediaRecorder();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
//mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(videoFilename);
mediaRecorder.setVideoEncodingBitRate(1000000);
mediaRecorder.setVideoFrameRate(30);
mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight());
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
try {
    mediaRecorder.prepare();
} catch (IOException e) {
    e.printStackTrace();
}

我已在 Android 7.1(三星 Galaxy S8)上测试了您的代码,它可以正常工作。只有模拟器存在问题。


1
是的,那就是问题所在,但在三星手机上仍然无法正常工作。具体来说是前置摄像头的问题。 - Alok Patel

0
对我来说,MediaRecorder -2147483648错误取决于设备和操作系统。通常情况下,录音机会启动一次,随后的启动将失败。修复方法是添加对MediaRecorder.release()的调用。
...
try {
      audioRecorderType_MR.stop();
      audioRecorderType_MR.release();  // <<-- ADD THIS LINE
} catch (Exception e) {
      J42CallerId.printStackTrace(new J42ProgramCheck("J42VM0072E:", e));
}
audioRecorderType_MR = null;
...

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