录制视频时,在视频右下角添加时间水印,达到监控录像的效果,如下图:
实现思路如下:
1.制作12张图片,分别是数字0-9,冒号和横折。首先用PS做成png24格式,最好是黑底白字(在代码中将黑色忽略)。
2.将上面制作好的12张png图片转成256色的bmp位图,可以使用windows自带的画图程序打开,然后另存为。
3.将第2步得到的256色bmp图片,转成c数组。
4.将第3步得到的c数组放到头文件tchip_digital_data.h里。
5.修改frameworks/av/media/libstagefright/CameraSource.cpp文件,在录制时,添加时间水印到每一个视频帧。
2.录制视频文件的容量和时间限制
录制视频需要分段保存,可以从系统源码考虑,看了以下一些代码:
-
framework/av/media/libstagefright/MPEG4Writer.cpp
-
package/apps/Camera/src/com/android/camera/actor/VideoActor.java
主要从MPEG4Writer.cpp中的kMax32BitFileSize 和入手,如下,修改单个文件最大容量为56M(0x3800000),发现利用系统Camera录像时,到达阀值后会提示“已达到大小上限”,并自动停止,保存已经录制的视频。
[c] view plaincopy
-
static const int64_t kMax32BitFileSize = 0x3800000;//0x00ffffffffLL; // 2^32-1 : max FAT32
-
static const int64_t kMax32BitDuration = 0x007fffffffLL;
然后追踪到VideoActor的处理。有一个思路,就是停止的时候,进行文件保存后立即重新启动录像。
[java] view plaincopy
-
public void stopVideoRecordingAsync() { // TChip ZJ
-
// for snapshot
-
stopObjectTracking();
-
mStopVideoRecording = true;
-
Log.d(TAG, “stopVideoRecordingAsync() mMediaRecorderRecording=” + mMediaRecorderRecording
-
+ “, mRecorderBusy=” + mRecorderBusy
-
+ “, isVideoProcessing()” + isVideoProcessing()
-
+ “, mStopVideoRecording =” + mStopVideoRecording);
-
mVideoContext.getZoomManager().changeZoomForQuality();
-
mVideoContext.setSwipingEnabled(true);
-
mHandler.removeMessages(UPDATE_RECORD_TIME);
-
mVideoContext.getShutterManager().setVideoShutterMask(false);
-
if (isVideoProcessing()) {
-
return;
-
}
-
if (mRecorderBusy) { // return for recorder is busy.
-
return;
-
}
-
mRecorderBusy = true;
-
mRecordingView.hide();
-
if (mMediaRecorderRecording) {
-
mVideoContext.getShutterManager().setVideoShutterEnabled(false);
-
if (mStoppingAction != STOP_RETURN_UNVALID && mCallFromOnPause != true) {
-
// mVideoContext.showProgress(mVideoContext.getResources().getString(R.string.saving)); // TChip ZJ : 去掉保存UI
-
}
-
mVideoSavingTask = new SavingTask();
-
mVideoSavingTask.start();
-
} else {
-
mRecorderBusy = false;
-
releaseRecorder();
-
if (mStoppingAction == STOP_RETURN_UNVALID) {
-
doReturnToCaller(false);
-
}
-
}
-
}
先吃饭了,明天再看实现的可行性以及效果(是否漏秒)。
继续追踪
看了下保存的逻辑,涉及以下两处源码:
packages/apps/Camera/src/com/android/camera/manager/MMProfileManager.java
mediatek/frameworks/base/mmprofile/java/com/mediatek/mmprofile/MMProfileManager.java
分享读者
作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。
被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!
我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。
主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。
如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!
我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!