Android 錄影新增時間戳水印

2021-09-05 02:00:32 字數 3188 閱讀 5957

demo介面功能如圖:跑的時候注意自己到設定加相機許可權

然後你要去了解一下yuv,參考:

yuv定義:分為三個分量,「y」表示明亮度,也就是灰度值;而「u」和「v」 表示的則是色度(chrominance或chroma),作用是描述影像色彩及飽和度,用於指定畫素的顏色。

主要了解yuv420sp,資料格式如下:

yuv420sp有兩種,就是nv12和nv21,區別在uv的順序反過來。

nv12: yyyyyyyy uvuv     =>yuv420sp

nv21: yyyyyyyy vuvu     =>yuv420sp

首先camera 相機流資料配置為nv21。

this.mcameraparamters = this.mcamera.getparameters();

this.mcameraparamters.setpreviewformat(imageformat.nv21);

mcolorformat = mediacodecinfo.codeccapabilities.color_formatyuv420semiplanar;//nv12

mediaformat.setinteger(mediaformat.key_color_format, mcolorformat);

mediaformat = mediaformat.createvideoformat(mime_type,videow, videoh);

....

mediaformat.setinteger(mediaformat.key_color_format, mcolorformat);

mmediacodec = mediacodec.createencoderbytype(mime_type);

mmediacodec.configure(mediaformat, null, null,mediacodec.configure_flag_encode);

....

1、新增時間戳

說一下大致原理,新增時間其實就和新增水印是一樣的,把一張轉換為nv12資料覆蓋在原幀資料上,只不過這個水印是動態生成的。

你可以用 canvas 每幀去畫,後轉成nv12資料,然後合併,例如這樣:

string date = mformat.format(new date());

bitmap bitmap=bitmap.createbitmap(100,20, bitmap.config.argb_8888);

canvas canvas=new canvas(bitmap);

paint p=new paint(paint.anti_alias_flag);

canvas.drawtext(date,0,0,p);

byte nv12=yuvosdutils.bitmaptonv12(bitmap,100,20);

//合成...

但是這樣每次都畫和生成,速度太慢了,別一種思路是事先生成所需要的字元nv12資料, 因為時間所需字符集不大,只有0~9,和"-" 下劃線,「 :」冒號和空格,常規如:"yyyy-mm-dd hh:mm:ss" 形式。所以可以先把字元yuv資料載入到記憶體,生成方式和上面類似,因為時間水印只需要黑白兩色,所以只需要yuv中的y資料,不需要uv,如果你需要彩色的話,需要保留uv

byte nv12 = yuvosdutils.bitmaptograynv(srcbit, w, h);//生成黑白字
而數字,可以用任意方式得到,這裡也是用canvas+bitmap 畫出來的,你也可以ps畫好,把轉成yuv資料,然後把黑色16轉為0,其它轉為1,(這一步是為了後面方便處理)最終把這些寫死在**中,像這樣

char num_0 = ;
還是容易看出這是數字0的,用的時候把數字替換到幀資料指定位置就可以了。詳寫yuvosdutils.c,

(如果你不想直接寫在**裡,也可以把資料儲存到本地,初始化的時候從本地取出來)呼叫如下:

初始化時間戳水印,主要是把數字yuv資料都載入到記憶體中。

yuvosdutils.initosd(off_x, off_y, pattern.length(), dstwidth, dstheight, rotation);
this.mcamera.setdisplayorientation(90);

this.mcameraparamters.setpreviewsize(width, height);

if (outdata == null) 

yuvosdutils.addosd(data, outdata, 「2018-11-21 19:40:01」);

最後不用時,釋放記憶體

yuvosdutils.releaseosd();
2、暫停錄製,繼續錄製

這個原理也很簡單,只需要控制queueinputbuffer 的時間軸就可以了

//mtime是暫停時長,暫停時長可以通過暫停時記錄當前時間,繼續時的時間減少上次暫停時間則為暫停時長

long currenttimeus = (system.nanotime()-mtime) / 1000;//通過控制時間軸,達到暫停錄製,繼續錄製的效果

codec.queueinputbuffer(index, 0, outdata.length, currenttimeus, 0);

mtime是暫停時長,暫停時長可以通過暫停時記錄當前時間,繼續時的當前時間減少上次暫停時間則為暫停時長。

正常currenttimeus 時間是隨著當前時間而移動的,而如果要暫停後繼續的話,只要減去暫停時長,就保證currenttimeus是暫停時開始的時間,從而達到效果。

demo 放git了。github位址

php 增加時間戳 php如何新增時間戳

php新增時間戳的方法 可以利用mktime 函式來新增。該函式返回乙個日期的unix時間戳,如果錯誤則返回false。具體使用方法如 mktime 0,0,0,date m date d 1,date y mktime 函式返回乙個日期的 unix 時間戳,如果錯誤則返回 false。語法 mkt...

Android 獲取時間戳 和時間戳轉日期

獲取系統時間戳 public string gettime 獲取系統時間 long currenttime system.currenttimemillis dateformat formatter new dateformat yyyy年 mm月dd日 hh時mm分ss秒 date date ne...

model時間戳自動新增

時間戳 系統支援自動寫入建立和更新的時間戳字段,有兩種方式配置支援。第一種方式,是在資料庫配置檔案中新增全域性設定 開啟自動寫入時間戳字段 auto timestamp true,第二種是直接在單獨的模型類裡面設定 protected autowritetimestamp true 欄位名預設建立時...