今天在写录屏录音时,单纯的录屏功能是正常使用的,但是添加上录音功能之后就一直报错,failed to get surface,
首先以为是没有权限的问题,但是后来检查完代码,发现权限都是没有问题的;
第二步检查了存储路径发现也是没有问题的;
然后就比较迷茫,不知道该怎么解决,反复测试之后,在调用的时候捕捉异常之后可以解决
代码如下:
private void createMediaRecorder() { int width = displayMetrics.widthPixels; int height = displayMetrics.heightPixels; int densityDpi = displayMetrics.densityDpi; // 创建保存路径 final File dirFile = FileUtils.getCacheMovieDir(this); boolean mkdirs = dirFile.mkdirs(); // 创建保存文件 mediaFile = new File(dirFile, FileUtils.getDateName("MediaRecorder") + ".mp4"); // 调用顺序不能乱 mediaRecorder = new MediaRecorder(); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setOutputFile(mediaFile.getAbsolutePath()); mediaRecorder.setVideoSize(width, height); mediaRecorder.setVideoFrameRate(30); mediaRecorder.setVideoEncodingBitRate(5 * width * height); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC) try { mediaRecorder.prepare(); } catch (Exception e) { e.printStackTrace(); } if (virtualDisplayMediaRecorder == null) { virtualDisplayMediaRecorder = mediaProjection.createVirtualDisplay("MediaRecorder", width, height, densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mediaRecorder.getSurface(), null, null); } else { virtualDisplayMediaRecorder.setSurface(mediaRecorder.getSurface()); } }
调用:
public void startRecording() {
if (!isMediaRecorderEnable) {
return;
}
if (isMediaRecording) {
return;
}
try {
createMediaRecorder();
mediaRecorder.start();
isMediaRecording = true;
} catch (Exception e) {
e.printStackTrace();
}
}
ps:目前支持的只有麦克风里面的录制;如果带上耳机就不能录制;
目前还没有修改,之后修改完再补充;以便后续查看