当使用MP4/H264且分辨率大于720p时,Android MediaRecorder在停止时崩溃
我正在尝试为android编写一个屏幕记录器,我使用它作为基础: 我的问题是:如果在mp4/h264设置下选择大于720p的分辨率,它会在停止时崩溃 示例: (例1) 不起作用 RecordingSession.java中的代码:当使用MP4/H264且分辨率大于720p时,Android MediaRecorder在停止时崩溃,android,mediarecorder,Android,Mediarecorder,我正在尝试为android编写一个屏幕记录器,我使用它作为基础: 我的问题是:如果在mp4/h264设置下选择大于720p的分辨率,它会在停止时崩溃 示例: (例1) 不起作用 RecordingSession.java中的代码: void start() { recorder=new MediaRecorder(); recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); recorder.setOu
void start() {
recorder=new MediaRecorder();
recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(config.frameRate);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setVideoSize(1080, 1920);
recorder.setVideoEncodingBitRate(config.bitRate);
recorder.setOutputFile(output.getAbsolutePath());
try {
recorder.prepare();
vdisplay=projection.createVirtualDisplay("andcorder",
1080, 1920, config.density,
VIRT_DISPLAY_FLAGS, recorder.getSurface(), null, null);
beeper.startTone(ToneGenerator.TONE_PROP_ACK);
recorder.start();
}
catch (IOException e) {
throw new RuntimeException("Exception preparing recorder", e);
}
}
停止时的输出:
07-29 13:52:32.880 7845-7845/com.commonsware.android.andcorder E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.commonsware.android.andcorder, PID: 7845
java.lang.RuntimeException: Unable to start service com.commonsware.android.andcorder.RecorderService@61a260a with Intent { act=com.commonsware.android.andcorder.STOP flg=0x10000000 cmp=com.commonsware.android.andcorder/.RecorderService bnds=[257,1321][832,1513] }: java.lang.RuntimeException: stop failed.
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3045)
at android.app.ActivityThread.access$2200(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
Caused by: java.lang.RuntimeException: stop failed.
at android.media.MediaRecorder.native_stop(Native Method)
at android.media.MediaRecorder.stop(MediaRecorder.java:851)
at com.commonsware.android.andcorder.RecordingSession.stop(RecordingSession.java:84)
at com.commonsware.android.andcorder.RecorderService.stopRecorder(RecorderService.java:152)
at com.commonsware.android.andcorder.RecorderService.onStartCommand(RecorderService.java:72)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3028)
at android.app.ActivityThread.access$2200(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
(示例2)-工作正常
void start() {
recorder=new MediaRecorder();
recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
recorder.setOutputFormat(MediaRecorder.OutputFormat.WEBM);
recorder.setVideoFrameRate(config.frameRate);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.VP8);
recorder.setVideoSize(1080, 1920);
recorder.setVideoEncodingBitRate(config.bitRate);
recorder.setOutputFile(output.getAbsolutePath());
try {
recorder.prepare();
vdisplay=projection.createVirtualDisplay("andcorder",
1080, 1920, config.density,
VIRT_DISPLAY_FLAGS, recorder.getSurface(), null, null);
beeper.startTone(ToneGenerator.TONE_PROP_ACK);
recorder.start();
}
catch (IOException e) {
throw new RuntimeException("Exception preparing recorder", e);
}
}
代码:
(示例3)-也可以正常工作
void start() {
recorder=new MediaRecorder();
recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
recorder.setOutputFormat(MediaRecorder.OutputFormat.WEBM);
recorder.setVideoFrameRate(config.frameRate);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.VP8);
recorder.setVideoSize(1080, 1920);
recorder.setVideoEncodingBitRate(config.bitRate);
recorder.setOutputFile(output.getAbsolutePath());
try {
recorder.prepare();
vdisplay=projection.createVirtualDisplay("andcorder",
1080, 1920, config.density,
VIRT_DISPLAY_FLAGS, recorder.getSurface(), null, null);
beeper.startTone(ToneGenerator.TONE_PROP_ACK);
recorder.start();
}
catch (IOException e) {
throw new RuntimeException("Exception preparing recorder", e);
}
}
如您所见,我可以使用webm/vp8以1080p(以及超过720p的任何其他分辨率)进行录制,但不能使用mp4/h264。然后你可能会问:为什么你不使用webm,它是有效的!
因此:
看看红色标记的字段。Webm不保存视频的长度、帧和比特率。而且我在webm中录制音频时遇到问题。
我想使用mp4/h264,但它在分辨率高于720p时失败。有解决办法吗
编辑:我的测试设备是LG G4/Android 6.0其功能可能由硬件决定。我也不能排除Android相关子系统中的一个bug。@commonware我在play store中尝试了其他类似的应用程序。我试过的两个应用程序都成功了,1080和1440p版本的应用程序和音频都成功了。如果我在代码中实现音频录制,它会崩溃。结果:这不是我的设备的问题/限制,而是你的代码的问题,但我不知道我必须改变什么,才能让它像其他应用一样工作。而且。。。是的,我尝试的应用程序只能在android 5.0或更高版本中运行,所以它们应该使用相同的API。你找到解决方案了吗?似乎我的问题与您的问题类似,是的,它可以工作WEBM/VP8 ok,但是的,它的输出细节非常奇怪(例如,当我为MediaRecorder设置24时,它在MX Player中显示fps 100…)