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 欄位名預設建立時...