录制视频时,在视频右下角添加时间水印,达到监控录像的效果,如下图:
实现思路如下:
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
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
95%以上Android开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!