使用 android 的 mediaRecorder 的文件大小限制?
File size limit on using android's mediaRecorder?
我使用 android 的媒体记录器制作了一个自定义摄像机。
我面临的问题是当文件大小达到 3.80 GB 时它停止录制。
- 我知道这不是文件系统问题,因为我的 SD 卡有 ntfs(我的
phone支持-荣耀6X)
- 我的 sd 卡上 space 足够了。
- 我什至没有使用 MediaRecorder.setMaxFileSize()。
- 我 phone 中的内置相机应用程序可以毫无问题地拍摄超过 3.80 GB 的视频。
那么这里到底有什么问题呢?
我知道在某些 android 设备中,相机应用程序具有嵌入式文件大小限制,与文件系统无关。
但这在制作自定义视频录制应用程序时应该不是问题吧?
编辑:在下面发布解决方案。
好的,我找到了解决方案,
问题是我没有使用 MediaRecorder.setMaxFileSize(),所以默认情况下限制设置为 4GB。
即使使用 MediaRecorder.setMaxFileSize(-ve 或 0),根据它的参考页面显然禁用了文件大小限制,仍然在内部将文件大小限制设置为 4GB(如果有人对此有更多信息,请分享) .
解决方案是,我使用 StatFS 在我的内部存储中找到了免费的 space,并将其设置为 setMaxFileSize() 的参数,这非常有效。我终于能够突破 4GB 的文件限制了。
这适用于支持大于 4GB 文件大小的所有文件系统。
我们可以设置.setMaxFileSize and then use .setNextOutputFile() method (Added in Android O, API level 26) with .setOnInfoListener() on MediaRecorder对象。
示例代码:
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可用。
我使用 android 的媒体记录器制作了一个自定义摄像机。 我面临的问题是当文件大小达到 3.80 GB 时它停止录制。
- 我知道这不是文件系统问题,因为我的 SD 卡有 ntfs(我的 phone支持-荣耀6X)
- 我的 sd 卡上 space 足够了。
- 我什至没有使用 MediaRecorder.setMaxFileSize()。
- 我 phone 中的内置相机应用程序可以毫无问题地拍摄超过 3.80 GB 的视频。
那么这里到底有什么问题呢? 我知道在某些 android 设备中,相机应用程序具有嵌入式文件大小限制,与文件系统无关。 但这在制作自定义视频录制应用程序时应该不是问题吧?
编辑:在下面发布解决方案。
好的,我找到了解决方案, 问题是我没有使用 MediaRecorder.setMaxFileSize(),所以默认情况下限制设置为 4GB。 即使使用 MediaRecorder.setMaxFileSize(-ve 或 0),根据它的参考页面显然禁用了文件大小限制,仍然在内部将文件大小限制设置为 4GB(如果有人对此有更多信息,请分享) . 解决方案是,我使用 StatFS 在我的内部存储中找到了免费的 space,并将其设置为 setMaxFileSize() 的参数,这非常有效。我终于能够突破 4GB 的文件限制了。 这适用于支持大于 4GB 文件大小的所有文件系统。
我们可以设置.setMaxFileSize and then use .setNextOutputFile() method (Added in Android O, API level 26) with .setOnInfoListener() on MediaRecorder对象。
示例代码:
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可用。