录像默认会有4G的限制,之所以有这样的限制,是因为目前很多存储设备都是fat格式的,fat的size是32位表示的,天然就有4G的限制,而且实际上在限制4G的情况下只能录出来3.8G。是因为
1)要留一部分buffer写moovbox
2)有的还要留部分buffer作为写数据的cache

在文件\frameworks\av\media\libstagefright\MPEG4Writer.cpp中,有对视频文件size的限制函数fileSizeLimit,源码如下:

bool MPEG4Writer::exceedsFileSizeLimit() {// No limitif (mMaxFileSizeLimitBytes == 0) {return false;}int64_t nTotalBytesEstimate = static_cast<int64_t>(mInMemoryCacheSize);for (List<Track *>::iterator it = mTracks.begin();it != mTracks.end(); ++it) {nTotalBytesEstimate += (*it)->getEstimatedTrackSizeBytes();}if (!mStreamableFile) {// Add 1024 bytes as error tolerancereturn nTotalBytesEstimate + 1024 >= mMaxFileSizeLimitBytes;}// Be conservative in the estimate: do not exceed 95% of// the target file limit. For small target file size limit, though,// this will not help.return (nTotalBytesEstimate >= (95 * mMaxFileSizeLimitBytes) / 100);
}

可以看到return (nTotalBytesEstimate >= (95 * mMaxFileSizeLimitBytes) / 100);的计算方式。mMaxFileSizeLimitBytes是4G,4G * 95% = 3.8G。

这种情况下的处理方式:

方式一:

通过adb shell blkid dev/block/mmcblk1p1判断sdcard的限制,此时如果输出的结果:

dev/block/mmcblk1p1: UUID="70CD-07EB" TYPE="vfat"

则表示sdcard是fat型的,fat用32位表示文件的大小,天然就有2^32 = 4G的限制。
这种情况下,软件是无法无法处理的,接受现状。

方式二:

在sdcard没有限制的情况下,可以通过软件在/frameworks/base/media/java/android/media/MediaRecorder.java的setVideoEncodingBitRate()中加入语句 setParameter(“param-use-64bit-offset=1”);来突破4G的限制,逻辑如下:
添加之后的函数:

    public void setVideoEncodingBitRate(int bitRate) {if (bitRate <= 0) {throw new IllegalArgumentException("Video encoding bit rate is not positive");}setParameter("video-param-encoding-bitrate=" + bitRate);setParameter("param-use-64bit-offset=1"); //add this}

从后往前查找 /frameworks/av/media/libstagefright/MPEG4Writer.cpp的函数MPEG4Writer::start中有通过
param->findInt32(kKey64BitFileOffset, &use64BitOffset)来判断fat是否用32位表示文件大小,如有如下设置则表示文件是64位来表示的,也就是没有4G的限制了。

    ......int32_t use64BitOffset;if (param &&param->findInt32(kKey64BitFileOffset, &use64BitOffset) &&use64BitOffset) {mUse32BitOffset = false;}......

而use64BitOffset的值取决于kKey64BitFileOffsetkKey64BitFileOffset的值是在文件/frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp中通过语句(*meta)->setInt32(kKey64BitFileOffset, mUse64BitFileOffset)设置的,可以看到具体函数:

void StagefrightRecorder::setupMPEG4orWEBMMetaData(sp<MetaData> *meta) {int64_t startTimeUs = systemTime() / 1000;(*meta)->setInt64(kKeyTime, startTimeUs);(*meta)->setInt32(kKeyFileType, mOutputFormat);(*meta)->setInt32(kKeyBitRate, mTotalBitRate);if (mMovieTimeScale > 0) {(*meta)->setInt32(kKeyTimeScale, mMovieTimeScale);}if (mOutputFormat != OUTPUT_FORMAT_WEBM) {(*meta)->setInt32(kKey64BitFileOffset, mUse64BitFileOffset);if (mTrackEveryTimeDurationUs > 0) {(*meta)->setInt64(kKeyTrackTimeStatus, mTrackEveryTimeDurationUs);}if (mRotationDegrees != 0) {(*meta)->setInt32(kKeyRotation, mRotationDegrees);}}
}

所以需要查看mUse64BitFileOffset的值。看他的赋值函数,主要取决于use64Bit。

status_t StagefrightRecorder::setParam64BitFileOffset(bool use64Bit) {ALOGV("setParam64BitFileOffset: %s",use64Bit? "use 64 bit file offset": "use 32 bit file offset");mUse64BitFileOffset = use64Bit;return OK;
}

setParam64BitFileOffset被调用的地方:

status_t StagefrightRecorder::setParameter(const String8 &key, const String8 &value) {ALOGV("setParameter: key (%s) => value (%s)", key.string(), value.string());if (key == "max-duration") {int64_t max_duration_ms;if (safe_strtoi64(value.string(), &max_duration_ms)) {return setParamMaxFileDurationUs(1000LL * max_duration_ms);}} else if (key == "max-filesize") {int64_t max_filesize_bytes;if (safe_strtoi64(value.string(), &max_filesize_bytes)) {return setParamMaxFileSizeBytes(max_filesize_bytes);}......} else if (key == "param-use-64bit-offset") {int32_t use64BitOffset;if (safe_strtoi32(value.string(), &use64BitOffset)) {return setParam64BitFileOffset(use64BitOffset != 0);}......

可以看到主要是通过key == "param-use-64bit-offset"来决定的,所以添加语句 setParameter(“param-use-64bit-offset=1”);来设置这个key的参数,就可以表示所录制的视频文件大小可以超过4G了。

方式三:

在https://android.googlesource.com/platform/frameworks/av/+/android-8.1.0_r14/media/libmediaplayerservice/StagefrightRecorder.cpp中也有看到如下处理方式(但此方法未经过实测验证,不能保证没有风险,仅供参考):
Enable recording files larger than 4GB by forcing 64-bit file-offsets
in the writer, if application indicates max-file-size greater than 4GB.

CRs-Fixed: 807377
Change-Id: Id1af5bdf3543af156e6d3d80be2e00c7df3b4134

— a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -87,6 +87,7 @@ static const char *kRecorderVideoLevel = "android.media.mediarecorder.video-enco
static const char *kRecorderCaptureFpsEnable = “android.media.mediarecorder.capture-fpsenable”;
static const char *kRecorderCaptureFps = “android.media.mediarecorder.capture-fps”;
static const char *kRecorderRotation = “android.media.mediarecorder.rotation”;
+static const int64_t kMax32BitFileSize = 0x00ffffffffLL; // 4GB

// To collect the encoder usage for the battery app
static void addBatteryData(uint32_t params) {
@@ -581,6 +582,10 @@ status_t StagefrightRecorder::setParamMaxFileSizeBytes(int64_t bytes) {
}

mMaxFileSizeBytes = bytes;
+

  • // If requested size is >4GB, force 64-bit offsets
  • mUse64BitFileOffset |= (bytes >= kMax32BitFileSize);

关于视频录制文件4G限制的处理方式相关推荐

  1. presentation视频录制与编辑

    任务:录制ppt报告视频(要求有ppt演示和讲解),生成1920*1080p的视频文件: 1.视频录制: (1)推荐方式:ppt放映+zoom录制 操作: ①录制:将ppt调到放映模式,在zoom & ...

  2. 视频录制,压缩实现源码

    实现代码: <!DOCTYPE html> <html><head><meta charset="utf-8"><title& ...

  3. android视频录制(调用系统视频录制)

    2019独角兽企业重金招聘Python工程师标准>>> 最近客户有一个视频录制的需求,于是,我就整理下可行的方案. 启动系统视频录制的代码: Intent mIntent = new ...

  4. 【铜】第174-9篇 一对一视频录制(九)一对多学生端删除白板及nginx下配CI

    关键词:webm文件在手机端播放, 一对多学生端删除白板, nginx下配CI 一.一对一视频录制 1.1.webm文件在手机端播放 1)在PC上 a.)用谷歌浏览器播放 http://123.57. ...

  5. Android 中使用MediaRecorder进行录像详解(视频录制)

    简单的视频录制功能. package com.video; import java.io.IOException; import android.app.Activity; import androi ...

  6. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制(转)

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  7. 牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  8. android拍照截图组件,Android截图命令screencap与视频录制命令screenrecord(示例代码)...

    查看帮助命令[email protected] ~$ adb shell screencap -v screencap: invalid option -- v usage: screencap [- ...

  9. 互动直播的视频录制与合成—支持多人离线重入

    实现的效果图: 上图合成了2个人视频,中途有1个人先离开之后又重新加入了房间. 一.业务场景 业务场景是这样的:多个用户(2-4人)直播的视频,合成为一个视频,这期间要满足2个条件:首先,录制途中可能 ...

最新文章

  1. DNN 数据访问策略 (转)
  2. Github上十大热门可视化面板!再也不用担心画图啦!
  3. 观点|重磅出炉!29页《业内观点:机器人行业的未来》
  4. react native redux 梳理
  5. 学python可以做什么职业好-学了那么多年python到底可以找什么工作?
  6. python学习--for循环详解
  7. 从今天开始,每天记录一点东西
  8. jieba和thulac使用比较
  9. access 查找工龄大于30_面试前必知必会的二分查找及其变种
  10. 程序员面试的一些注意点
  11. visual studio 2013 编译 filezilla和filezilla server
  12. 查询中接受的主体参数
  13. 数据库表结构及索引设计
  14. Coap在Andorid中的简单应用
  15. Golang实现文件搜索器
  16. 基于双语数据集搭建seq2seq模型
  17. ComputerVision会议+领先研究室+专家+代码网址(转载)
  18. SSM全注解开发的网上商城系统
  19. 安迪的第一个字典Uva 10815
  20. ubuntu vi/vim退出文件

热门文章

  1. 【Pandas 数据分析3-2】Pandas 数据读取与输出 - Excel
  2. 想知道哪个音频翻译成文字的软件好用?这篇文章能够给你答案
  3. ln - 软链接与硬链接区别
  4. 基思给电视机换了个频道,但电视里的背景声音在他脑海里描绘出了一张情报界的组织机构图
  5. gMIS吉密斯十年执念:Lower Costs较低成本Better Productivity较高效率
  6. 网站安全测试与检测中 发现的OA系统中的SQL注入漏洞
  7. 2022留学生落户上海能通过年终奖提高社保基数吗?
  8. 可视化财务报表不会做?那是你没用对报表工具
  9. Java构造函数(构造方法)的简介说明
  10. 经销商窜货怎么办?最好的解决方案是?