Android视频添加时间水印

由于需要在高通平台上做行车记录的功能,需要给视频加上时间水印。

网上搜索了一下方案,发现有在MTK平台做过类似功能的,参考:
http://blog.csdn.net/jimbo_lee/article/details/27545193

最直接的想法就是获取到视频编码前每一帧YUV数据,将时间水印覆盖到对应的像素点上,然后再进行视频编码。

效果图:
这里写图片描述

主要实现过程:
1.准备0-9数字以及- / 等符号(时间水印中包含的元素)的Bitmap图片,如果是灰度的时间水印,8位深度的Bitmap就可以。Bitmap图片转换成对应的字节数组可以借助工具实现,当然也可以自己解析Bitmap文件(参考http://blog.csdn.net/smileorcryps/article/details/60756967),获取到时间对应的字节数组后,直接覆盖YUV中相应位置的Y分量就可以了;

2.找到相机中video数据流后处理的位置,高通平台hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp(具体的位置参考后面贴的patch),在这里先根据当前时间获取到具体的水印字节数组,然后修改YUV数据中Y分量(NV21格式,Y单独存储,修改起来也相对简单),这样最后生成的视频中就会包含时间水印了。

问题:时间水印闪烁跳动

之前是修改的frameworks中CameraSource.cpp

void CameraSource::dataCallbackTimestamp(int64_t timestampUs,
int32_t msgType, const sp &data) {

这种方式会造成水印不规则闪烁,怀疑是内存缓存的问题,函数是有同步控制的,for循环中的值直接跑乱了。

后来换成在hardware的video流处理阶段进行处理就可以了。

只针对720p视频修改的patch:

diff --git a/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp b/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp
old mode 100644
new mode 100755
index 60f7191..891d743
--- a/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp
+++ b/hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp
@@ -1022,6 +1022,7 @@ QCamera2HardwareInterface::QCamera2HardwareInterface(uint32_t cameraId)
       mAdvancedCaptureConfigured(false),
       mFPSReconfigure(false)
 {
+   mWatermarkBuf = NULL;
 #ifdef TARGET_TS_MAKEUP
     mMakeUpBuf = NULL;
     memset(&mFaceRect, -1, sizeof(mFaceRect));
@@ -2222,6 +2223,13 @@ int QCamera2HardwareInterface::startRecording()
     if (rc == NO_ERROR) {
         rc = startChannel(QCAMERA_CH_TYPE_VIDEO);
     }
+   
+   if (mWatermarkBuf == NULL) {
   
+     
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在 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 对象的属性来改变水印的样式。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值