当使用MP4/H264且分辨率大于720p时,Android MediaRecorder在停止时崩溃

当使用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

我正在尝试为android编写一个屏幕记录器,我使用它作为基础:

我的问题是:如果在mp4/h264设置下选择大于720p的分辨率,它会在停止时崩溃

示例:

(例1) 不起作用

RecordingSession.java中的代码:

  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…)