由于需要在高通平台上做行车记录的功能,需要给视频加上时间水印。
网上搜索了一下方案,发现有在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) {
+