使用MediaRecorder api在android中进行屏幕录制
嘿,我正在尝试使用mediarecorder api在android lolipop中录制一个屏幕广播应用程序。问题是我的应用程序行为怪异。每当我在VideoRecorder类中调用start recording时,即使在硬编码配置(如视频大小和输出文件)时,手机也会重新启动。之前的应用程序运行良好-将内容保存在正确的位置,视频本身看起来不错,但后来我在代码中做了一些更改,现在它不工作了。知道我错过了什么吗? 这是我的密码:使用MediaRecorder api在android中进行屏幕录制,android,mediarecorder,android-mediarecorder,android-mediaprojection,Android,Mediarecorder,Android Mediarecorder,Android Mediaprojection,嘿,我正在尝试使用mediarecorder api在android lolipop中录制一个屏幕广播应用程序。问题是我的应用程序行为怪异。每当我在VideoRecorder类中调用start recording时,即使在硬编码配置(如视频大小和输出文件)时,手机也会重新启动。之前的应用程序运行良好-将内容保存在正确的位置,视频本身看起来不错,但后来我在代码中做了一些更改,现在它不工作了。知道我错过了什么吗? 这是我的密码: public class VideoRecorder { privat
public class VideoRecorder {
private int screenDensity, screenHeight, screenWidth;
private MediaRecorder mMediaRecorder;
private VirtualDisplay mVirtualDisplay;
private MediaProjection mediaProjection;
private String directory, filename;
private Display defaultDisplay = null;
private DisplayMetrics metrics;
public VideoRecorder(Display defaultDisplay) {
//this.defaultDisplay = defaultDisplay;
//metrics = new DisplayMetrics();
//defaultDisplay.getMetrics(metrics);
//screenDensity = metrics.densityDpi;
// screenHeight = metrics.heightPixels;
// screenWidth = metrics.widthPixels;
}
void prepareVideoRecorder() {
initRecorder();
prepareRecorder();
}
private void initRecorder() {
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(540, 888);
// mMediaRecorder.setOutputFile(directory + "/" + filename + ".mp4");
mMediaRecorder.setOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsoluteFile() + "/recorderrsr.mp4");
}
void startRecording(MediaProjection mediaProjection) {
mMediaRecorder = new MediaRecorder();
initRecorder();
prepareRecorder();
this.mediaProjection = mediaProjection;
mMediaRecorder.start();
mVirtualDisplay = createVirtualDisplay();
}
private VirtualDisplay createVirtualDisplay() {
return mediaProjection.createVirtualDisplay("MainActivity",
540, 888, 240,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/);
}
void setFilename(String filename) {
this.filename = filename;
}
void setDirectory(String directory) {
this.directory = directory;
}
void stopRecording() {
mMediaRecorder.stop();
mMediaRecorder.reset();
if (mediaProjection != null) {
mediaProjection.stop();
mediaProjection = null;
}
if (mMediaRecorder != null) {
mMediaRecorder.release();
mMediaRecorder = null;
}
if (mVirtualDisplay != null) {
mVirtualDisplay.release();
}
}
private void prepareRecorder() {
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
void release() {
mMediaRecorder.release();
}
}
我确信该位置存在,并且我拥有正确的权限——正如我之前所说,该应用程序工作正常。
谢谢帮助Jon它是重新启动还是重新启动?您可以通过
adb logcat
是否退出来区分差异。如果是框架重启,那么日志输出中应该有一些有趣的内容。如果是重新启动,可能没有——但这表明系统级别或硬件出现严重故障。您是否尝试过多个设备?你测试的是哪种设备和特定版本的Android?我在logcat中找不到任何有趣的东西,你可以在这里看看:它是重新启动还是重新启动?您可以通过adb logcat
是否退出来区分差异。如果是框架重启,那么日志输出中应该有一些有趣的内容。如果是重新启动,可能没有——但这表明系统级别或硬件出现严重故障。您是否尝试过多个设备?您正在测试哪种设备和特定版本的Android?我在logcat中找不到任何有趣的东西,您可以在这里查看: