MediaRecorder准备失败:-2147483648为nougat

时间:2017-04-21 02:55:50

标签: android mediarecorder android-camera2

我正在编写一个应用程序来记录从相机到表面的视频。

以下代码用于准备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(videoFilename),

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只是一个Object Size类。

当我尝试启动MediaRecorder时,我得到java.io.IOException: prepare failed.

奇怪的是它只在Nougat OS中崩溃,在其他设备中它正常工作。

2 个答案:

答案 0 :(得分:1)

我猜你在模拟器上运行这段代码。实际上,仿真器不支持MediaRecorder。 见:MediaRecorder

  

注意:目前,MediaRecorder无法在模拟器上运行。

嗯,你可以通过评论Mic config来测试它,你会看到它的工作。

Z = np.unique([tuple(row) for row in X + Y])

我已在Android 7.1(三星Galaxy S8)上测试了您的代码及其工作原理。仅在模拟器上发布。

答案 1 :(得分:0)

对我来说,MediaRecorder -2147483648 错误 取决于设备和操作系统级别。通常,录音机 将启动 1 次,随后的启动将失败。 修复方法是添加对 MediaRecorder.release() 的调用。

...
try {
      audioRecorderType_MR.stop();
      audioRecorderType_MR.release();  // <<-- ADD THIS LINE
} catch (Exception e) {
      J42CallerId.printStackTrace(new J42ProgramCheck("J42VM0072E:", e));
}
audioRecorderType_MR = null;
...