阅读 338

Android 录制视频添加时间水印

Android 录制视频添加时间水印

1.添加时间水印


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




 


 


实现思路如下:


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

然后从MMProfileManager定位到MMProfile:


mediatek/frameworks/base/mmprofile/java/com/mediatek/mmprofile/MMProfile.java

这个类比较简单,加载了JNI库,再追下去就到c了。


[java] view plaincopy


public class MMProfile   

{  

    static  

    {  

        System.loadLibrary("mmprofile_jni");  

    }  

  

    public static final int MMP_RootEvent = 1;  

  

    // MMP_LogType  

    public static final int MMProfileFlagStart = 1;  

    public static final int MMProfileFlagEnd = 2;  

    public static final int MMProfileFlagPulse = 4;  

    public static final int MMProfileFlagEventSeparator = 8;  

    public static final int MMProfileFlagSystrace = 0x80000000;  

  

    public native static int MMProfileRegisterEvent(int parent, String name);  

    public native static int MMProfileFindEvent(int parent, String name);  

    public native static void MMProfileEnableEvent(int event, int enable);  

    public native static void MMProfileEnableEventRecursive(int event, int enable);  

    public native static int MMProfileQueryEnable(int event);  

    public native static void MMProfileLog(int event, int type);  

    public native static void MMProfileLogEx(int event, int type, int data1, int data2);  

    public native static int MMProfileLogMetaString(int event, int type, String str);  

    public native static int MMProfileLogMetaStringEx(int event, int type, int data1, int data2, String str);  

转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui 

————————————————

版权声明:本文为CSDN博主「周木水」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zhoumushui/article/details/43794919


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐