Android 录制视频添加时间水印

录制视频时,在视频右下角添加时间水印,达到监控录像的效果,如下图:

实现思路如下:

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

  1. static const int64_t kMax32BitFileSize = 0x3800000;//0x00ffffffffLL; // 2^32-1 : max FAT32

  2. static const int64_t kMax32BitDuration = 0x007fffffffLL;

然后追踪到VideoActor的处理。有一个思路,就是停止的时候,进行文件保存后立即重新启动录像。

[java] view plaincopy

  1. public void stopVideoRecordingAsync() { // TChip ZJ

  2. // for snapshot

  3. stopObjectTracking();

  4. mStopVideoRecording = true;

  5. Log.d(TAG, “stopVideoRecordingAsync() mMediaRecorderRecording=” + mMediaRecorderRecording

  6. + “, mRecorderBusy=” + mRecorderBusy

  7. + “, isVideoProcessing()” + isVideoProcessing()

  8. + “, mStopVideoRecording =” + mStopVideoRecording);

  9. mVideoContext.getZoomManager().changeZoomForQuality();

  10. mVideoContext.setSwipingEnabled(true);

  11. mHandler.removeMessages(UPDATE_RECORD_TIME);

  12. mVideoContext.getShutterManager().setVideoShutterMask(false);

  13. if (isVideoProcessing()) {

  14. return;

  15. }

  16. if (mRecorderBusy) { // return for recorder is busy.

  17. return;

  18. }

  19. mRecorderBusy = true;

  20. mRecordingView.hide();

  21. if (mMediaRecorderRecording) {

  22. mVideoContext.getShutterManager().setVideoShutterEnabled(false);

  23. if (mStoppingAction != STOP_RETURN_UNVALID && mCallFromOnPause != true) {

  24. // mVideoContext.showProgress(mVideoContext.getResources().getString(R.string.saving)); // TChip ZJ : 去掉保存UI

  25. }

  26. mVideoSavingTask = new SavingTask();

  27. mVideoSavingTask.start();

  28. else {

  29. mRecorderBusy = false;

  30. releaseRecorder();

  31. if (mStoppingAction == STOP_RETURN_UNVALID) {

  32. doReturnToCaller(false);

  33. }

  34. }

  35. }

先吃饭了,明天再看实现的可行性以及效果(是否漏秒)。

继续追踪

看了下保存的逻辑,涉及以下两处源码:

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年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。

腾讯T3架构师学习专题资料

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 视频录制添加时间水印,可以使用 MediaRecorder 类来录制视频,并使用 Canvas 类来绘制时间水印。以下是一个简单的示例: 1. 在布局文件中添加一个 SurfaceView 元素,用于显示摄像头预览和录制视频: ```xml <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 在 Activity 中获取 SurfaceView,并设置它作为 MediaRecorder 的预览: ```java SurfaceView surfaceView = findViewById(R.id.surfaceView); MediaRecorder mediaRecorder = new MediaRecorder(); mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); ``` 3. 在 SurfaceView 上绘制时间水印,可以在 SurfaceView 的回调方法 surfaceCreated() 中获取 Canvas 对象,并在其中绘制水印: ```java surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { Canvas canvas = holder.lockCanvas(); Paint paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(50); canvas.drawText(getCurrentTime(), 100, 100, paint); holder.unlockCanvasAndPost(canvas); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // do nothing } @Override public void surfaceDestroyed(SurfaceHolder holder) { // do nothing } }); private String getCurrentTime() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(new Date()); } ``` 4. 开始录制视频: ```java mediaRecorder.start(); ``` 这样就可以在 Android 视频录制添加时间水印了。当然,还可以通过调整 Paint 对象的属性来改变水印的样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值