【问题标题】:File size limit on using android's mediaRecorder?使用android的mediaRecorder的文件大小限制?
【发布时间】:2018-12-24 03:42:45
【问题描述】:

我使用 android 的媒体记录器制作了一个自定义摄像机。 我面临的问题是当文件大小达到 3.80 GB 时它会停止录制。

  • 我知道这不是文件系统问题,因为我的 sdcard 有 ntfs(我的 手机支持-荣耀6X)
  • 我的 SD 卡上有足够的空间。
  • 我什至没有使用 MediaRecorder.setMaxFileSize()。
  • 我手机中的内置相机应用程序可以轻松拍摄超过 3.80 GB 的视频。

那么这里的问题到底是什么? 我知道在某些 android 设备中,相机应用程序具有嵌入式文件大小限制,与文件系统无关。 但这在制作自定义视频录制应用时应该不是问题吧?

编辑:在下面发布解决方案。

【问题讨论】:

    标签: android android-camera android-camera2 android-mediarecorder


    【解决方案1】:

    好的,我找到了解决方案, 问题是我没有使用 MediaRecorder.setMaxFileSize(),所以默认情况下限制设置为 4GB。 即使使用 MediaRecorder.setMaxFileSize(-ve or 0),它显然根据其参考页面禁用了文件大小限制,但仍然在内部将文件大小限制设置为 4GB(如果有人对此有更多信息,请分享)。 解决方案是,我使用 StatFS 在内部存储中找到了可用空间,并将其设置为 setMaxFileSize() 的参数,效果很好。我终于可以突破 4GB 文件的限制了。 这适用于所有支持文件大小大于 4GB 的文件系统。

    【讨论】:

      【解决方案2】:

      我们可以设置.setMaxFileSize,然后在MediaRecorder对象上使用.setNextOutputFile()方法(Android O中添加,API级别26)和.setOnInfoListener()

      示例代码:

      MediaRecorder recorder = new MediaRecorder();
      recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
      recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
      String recordFilePath = "/mnt/sdcard/video_124.mp4";
      recorder.setOutputFile(recordFilePath);
      recorder.setVideoEncodingBitRate(10_00_000);
      recorder.setVideoFrameRate(18);
      recorder.setVideoSize(720,1280);
      recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
      
      // imp      
      recorder.setMaxFileSize(100000000); // 10000000  = 10 mb | 100000000 = 100 mb
      recorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
                  @Override
                  public void onInfo(MediaRecorder mr, int what, int extra) {
                      Log.i(TAG,String.format(Locale.US,"onInfoListen what : %d | extra %d", what, extra));
      
                  if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_APPROACHING) {
                      try {
                          recorder.setNextOutputFile((new RandomAccessFile("/mnt/sdcard/video_125.mp4"),"rw").getFD()));
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
                  }
              });
      
      recorder.prepare();
      recorder.start();
      

      这里有完整的gist version 可用。

      【讨论】:

        猜你喜欢
        • 2020-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        相关资源
        最近更新 更多