本發(fā)明涉及信息安全技術(shù)領(lǐng)域,特別涉及一種針對(duì)安卓設(shè)備產(chǎn)生的視頻添加水印的方法。
背景技術(shù):
在取證或監(jiān)控等一些需要錄制視頻并存檔的應(yīng)用場(chǎng)景,通常需要配備專業(yè)的視頻錄制或監(jiān)控設(shè)備。這些設(shè)備本身造價(jià)比較高,使用和維護(hù)成本也比較高。專業(yè)的錄制設(shè)備能夠?qū)崿F(xiàn)高清晰度的視頻錄制,但體積通常較大,不易隨身攜帶。與此同時(shí),在一些應(yīng)用場(chǎng)景中,可能需要實(shí)時(shí)為視頻添加時(shí)間水印或自定義的圖像水印。前者的添加功能通常在一些專業(yè)設(shè)備中有實(shí)現(xiàn),但后者一般都是通過(guò)后期制作添加。這就使得所添加的水印的實(shí)時(shí)性不夠強(qiáng)。與此同時(shí),專業(yè)錄制或監(jiān)控設(shè)備能夠在視頻中增加實(shí)時(shí)時(shí)間戳,但樣式單一,通常只能使用預(yù)定義的單一格式,無(wú)法滿足多樣的需求,也不能在提取視頻后針對(duì)視頻進(jìn)行校驗(yàn),判斷是否被修改。
安卓智能手機(jī)是現(xiàn)在很容易獲得的一種設(shè)備,其配備的攝像頭像素較高,通常情況下智能設(shè)備同樣能夠支持高清視頻的錄制。這類設(shè)備容易攜帶,使用方便且使用限制較少,但是安卓智能設(shè)備的錄像功能沒(méi)有實(shí)現(xiàn)時(shí)間戳或其他自定義水印的添加。這就使得在上述應(yīng)用場(chǎng)景中無(wú)法直接使用安卓智能設(shè)備進(jìn)行視頻錄制。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明針對(duì)現(xiàn)有技術(shù)的缺陷,提供了一種針對(duì)安卓設(shè)備產(chǎn)生的視頻添加水印的方法,能有效的解決上述現(xiàn)有技術(shù)存在的問(wèn)題。
一種針對(duì)安卓設(shè)備產(chǎn)生的視頻添加水印的方法,包括以下步驟:
S1:安卓設(shè)備源生視頻流的視頻編碼分析,對(duì)安卓原生視頻幀的特殊的YUV結(jié)構(gòu)進(jìn)行解析;
S2:將通用RBG色彩空間編碼轉(zhuǎn)換為安卓源生視頻流編碼YUV格式;
S3:本機(jī)時(shí)間校準(zhǔn);
S4:自定義水印實(shí)時(shí)添加,該步驟有兩個(gè)分支,一為文字添加,二為圖像添加,在對(duì)視頻幀進(jìn)行獲取并添加水印后,將幀送入視頻編碼及混合器,進(jìn)行轉(zhuǎn)碼與輸出;
S5:時(shí)間戳實(shí)時(shí)添加;
S6:在視頻提取后進(jìn)行校驗(yàn),判斷是否正確。
作為優(yōu)選,S1的詳細(xì)步驟如下:
S11:獲取源生視頻幀,為安卓設(shè)備相機(jī)加入預(yù)覽回調(diào),開(kāi)啟相機(jī),并在預(yù)覽回調(diào)中取得視頻幀,該幀即為待分析數(shù)據(jù);
S12:分離灰度數(shù)據(jù)與顏色數(shù)據(jù);
S13:分析顏色數(shù)據(jù),從灰度數(shù)據(jù)0位置開(kāi)始,相鄰四個(gè)像素點(diǎn)為一組,由顏色數(shù)據(jù)中從0開(kāi)始的一個(gè)或一組數(shù)據(jù)進(jìn)行控制;設(shè)圖片尺寸為WIDTH*HEIGHT,則下標(biāo)為0、1、WIDTH,WIDTH+1的灰度數(shù)據(jù),其顏色中V通道為WIDTH*HEIGHT,U通道則為WIDTH*HEIGHT+1,后續(xù)數(shù)據(jù)以此類推。
作為優(yōu)選,S12的詳細(xì)步驟如下:
S121:設(shè)獲取到的圖片尺寸為WIDTH*HEIGHT像素;
S122:取數(shù)組中下標(biāo)為0到下標(biāo)為WIDTH*HEIGHT-1的數(shù)據(jù),即為灰度數(shù)據(jù);
S123:將該灰度數(shù)據(jù)輸出成為圖片,則得到無(wú)顏色的黑白圖片,灰度數(shù)據(jù)得以證明;
S124:取數(shù)組中剩余部分,即為顏色數(shù)據(jù)。
作為優(yōu)選,S2的詳細(xì)步驟如下:
S21:RBG數(shù)據(jù)轉(zhuǎn)換為通行YUV420數(shù)據(jù);首先將RBG數(shù)據(jù)讀入數(shù)組,從第一個(gè)像素開(kāi)始,每三位取一次數(shù)據(jù),即為當(dāng)前像素的RBG數(shù)據(jù),使用通行的RBG與YUV420轉(zhuǎn)換算法可得相應(yīng)YUV420數(shù)據(jù);
S22:YUV420轉(zhuǎn)換為安卓源生視頻支持的NV21格式,由于YUV420數(shù)據(jù)與androd源生視頻的色彩分量不兼容,因此需要進(jìn)行格式轉(zhuǎn)換。具體的轉(zhuǎn)換步驟為:
S221:灰度部分原樣取值;
S222:提取灰度數(shù)據(jù)后,首先取V數(shù)據(jù)一位,置于灰度數(shù)據(jù)后第一位。再取U數(shù)據(jù)一位,置于一位V數(shù)據(jù)之后,此后VU數(shù)據(jù)均順序取值并交叉排布,保持V0U0V1U1……VnUn的順序即可。
作為優(yōu)選,S3的具體步驟如下:
S31:定義時(shí)間偏移存儲(chǔ)位,在Constants文件中定義靜態(tài)全局變量DATE_OFFSET,用于存儲(chǔ)時(shí)間偏移量;該偏移量表示本機(jī)的時(shí)間與網(wǎng)絡(luò)時(shí)間之間的差值;
S32:獲取網(wǎng)絡(luò)時(shí)間與時(shí)間偏移步驟如下:
S321:調(diào)用URLConntection訪問(wèn)國(guó)家授時(shí)中心服務(wù)器,獲取數(shù)據(jù)并解析。這里獲取到的數(shù)據(jù)是以毫秒為單位的時(shí)間數(shù)據(jù)。
S322:計(jì)算時(shí)間偏移量,使用系統(tǒng)System.currentMillis()獲取本機(jī)時(shí)間,計(jì)算本機(jī)時(shí)間與網(wǎng)絡(luò)時(shí)間的差值,存儲(chǔ)至偏移存儲(chǔ)位;該值為帶符號(hào)長(zhǎng)整型;
S33:定義真實(shí)時(shí)間,定義getCurrentDate方法,使用系統(tǒng)當(dāng)前時(shí)間作為基準(zhǔn),與時(shí)間偏移值相加,獲得當(dāng)前的真實(shí)時(shí)間,并使用Data對(duì)象將其轉(zhuǎn)換成為YYYY-MM-DD HH:MM:SS形式,返回給調(diào)用者。
作為優(yōu)選,S4的具體步驟如下:
S41:文字添加,步驟如下:
S411:獲得文字點(diǎn)陣編碼,使用通行的文字點(diǎn)陣轉(zhuǎn)換算法,將待轉(zhuǎn)換文字轉(zhuǎn)換為描述點(diǎn)陣的數(shù)組;該點(diǎn)陣數(shù)組即為待添加水印的Y數(shù)據(jù),存儲(chǔ)成名為preText的byte數(shù)組;
S412:定義文字顏色UV值,將待添加的文字顏色從RBG的描述方式轉(zhuǎn)換為UV的描述方式,由于Y數(shù)據(jù)已經(jīng)存在,此時(shí)只需將待添加的顏色的RBG值轉(zhuǎn)換為YUV值即可;這里將通行的YUV算法進(jìn)行改進(jìn),擯棄計(jì)算獲得的Y通道,僅留存UV通道的值;最終獲得一個(gè)U值和一個(gè)V值;
S413:獲取待添加視頻幀并進(jìn)行添加,步驟如下:
S4131:設(shè)置從視頻幀的x,y位置開(kāi)始添加水印,為相機(jī)添加回調(diào)接口,在回調(diào)接口的getFrameData方法中實(shí)時(shí)獲取到錄制的視頻幀,并存成名為src的byte數(shù)組;
S4132:將獲取到的src數(shù)組的內(nèi)存地址映射到底層的JNI中;
S4133:將指向src的指針p偏移至待添加位置,根據(jù)開(kāi)始添加前指定的偏移x,y,將指針p移至y*WIDTH+x位置,即在p的值上累加y*WIDTH+x;
S4134:從當(dāng)前p所指偏移位置開(kāi)始,遍歷src數(shù)組內(nèi)存區(qū)域中的數(shù)據(jù),同時(shí)遍歷步驟S411中獲取到的preText點(diǎn)陣編碼;當(dāng)preText數(shù)組遍歷到非0x00的數(shù)據(jù)時(shí),將preText相應(yīng)位置的數(shù)據(jù)寫(xiě)入p指針當(dāng)前位置的內(nèi)存中,重復(fù)上述操作直至preText數(shù)組遍歷結(jié)束;
S4135:在Y通道添加完后,根據(jù)S22中獲取到的視頻幀的排布規(guī)律,計(jì)算出src數(shù)組該位置的UV數(shù)據(jù)的地址,將S412獲取到的U和V數(shù)據(jù)寫(xiě)到相應(yīng)位置,V的地址可以根據(jù)p+y*WIDTH/2+x計(jì)算,U的地址則為V+1;
需要注意的是步驟S4134和S4135必須同時(shí)進(jìn)行。
S42圖像添加,具體步驟如下:
S421:圖像編碼數(shù)組的獲取,首先使用通用的方法或工具將待添加圖片轉(zhuǎn)換成為bmp格式圖像,然后去除獲得的bmp圖像的頭;Bmp圖像前56位為頭信息,讀取從第57位開(kāi)始的其余數(shù)據(jù)進(jìn)入內(nèi)存,放置在prePic數(shù)組中;即可得到待添加的圖像的YUV數(shù)據(jù);
S422:獲取待添加視頻幀并進(jìn)行添加。
作為優(yōu)選,所述S422的詳細(xì)步驟如下:
S4231:設(shè)置從視頻幀的x,y位置開(kāi)始添加水印,為相機(jī)添加回調(diào)接口,在回調(diào)接口的getFrameData方法中實(shí)時(shí)獲取到錄制的視頻幀,并存成名為src的byte數(shù)組;
S4232:將獲取到的src數(shù)組的內(nèi)存地址映射到底層的JNI中;
S4233:將指向src的指針p偏移至待添加位置,根據(jù)開(kāi)始添加前指定的偏移x,y,將指針p移至y*WIDTH+x位置,即在p的值上累加y*WIDTH+x;
S4234:設(shè)待疊加圖像尺寸為W*H,若prePic當(dāng)前位置數(shù)據(jù)不為0x00或0xff,則將prePic當(dāng)前位置的數(shù)據(jù)寫(xiě)入同步遞增的p指針?biāo)傅膕rc數(shù)組的相應(yīng)位置,直至遍歷至prePic的W*H-1位置時(shí)結(jié)束;
S4235:向src寫(xiě)入數(shù)據(jù)后,取得prePic當(dāng)前像素的U和V數(shù)據(jù),并將該數(shù)據(jù)寫(xiě)入src相應(yīng)位置Y數(shù)據(jù)所屬的UV分量上,然后繼續(xù)遍歷直至完成遍歷。
作為優(yōu)選,S5的詳細(xì)步驟如下:
S51:獲取校準(zhǔn)時(shí)間,通過(guò)S3中所屬方法獲得當(dāng)前的時(shí)間,并轉(zhuǎn)換成為字符串,待添加;
S52:構(gòu)建常用文字點(diǎn)陣映射數(shù)組,預(yù)先將時(shí)間戳添加所需數(shù)字和符號(hào)轉(zhuǎn)換為編碼數(shù)組,并以ascii碼作為索引,編譯成靜態(tài)常量,供添加過(guò)程中檢索并直接使用,定義每個(gè)字符的點(diǎn)陣大小,這里使用n*n描述其大?。?/p>
S53:時(shí)間戳水印添加,其詳細(xì)步驟如下:
S531:將獲取到的經(jīng)校準(zhǔn)的時(shí)間字符串的地址映射到JNI層;
S532:將字符串中每個(gè)字符編碼轉(zhuǎn)換為ascii值,并查表獲得每個(gè)字符的點(diǎn)陣數(shù)組;
S533:循環(huán)遍歷字符串,將點(diǎn)陣數(shù)組使用S413所描述的步驟疊加至視頻幀中,并將下次疊加的偏移量的x值增加n。直至遍歷完成。
作為優(yōu)選,S6的詳細(xì)步驟如下:
S61:完整性視頻摘要信息獲?。煌ㄟ^(guò)MD5或hash256信息摘要算法獲得視頻校驗(yàn)字符串;記為verify_str;
S62:視頻導(dǎo)出過(guò)程中分段傳輸并校驗(yàn),其步驟如下:
S621:指定byte數(shù)組buffer,長(zhǎng)度x。從視頻文件頭部起始位置開(kāi)始,讀取后續(xù)的x長(zhǎng)度數(shù)據(jù)到buffer中;
S622:將buffer中的數(shù)據(jù)使用MD5或HASH256獲取這段數(shù)據(jù)的信息摘要,記作src_verify_str;
S623:將buffer中數(shù)據(jù)寫(xiě)入目標(biāo)文件,并從目標(biāo)文件中獲取到該段數(shù)據(jù)的拷貝,對(duì)這段數(shù)據(jù)進(jìn)行MD5或HASH256計(jì)算,獲得其摘要,記作dest_verify_str;
S624:對(duì)比src_verify_str與dest_verify_str是否一致,一致則繼續(xù)下一次讀取,否則重新讀取該段數(shù)據(jù),直至文件被遍歷完;
S63:通過(guò)MD5或hash256信息摘要算法獲得導(dǎo)出后的視頻校驗(yàn)信息記為final_verify_str;將該final_verify_str與verify_str做對(duì)比,一致則表示該視頻完整且可靠,不一致則表示視頻不可用。
作為優(yōu)選,為提升校驗(yàn)信息的可靠性和有效性,使用云端存儲(chǔ)校驗(yàn)信息,并提供校驗(yàn)信息在線獲取功能;
1、在S61流程結(jié)束后將MD5或HASH256摘要信息存儲(chǔ)至云端服務(wù)器中,并將視頻信息與校驗(yàn)信息做映射;
2、在S63步驟開(kāi)始前,從云端獲取到指定的數(shù)據(jù),獲取到摘要信息,作為校驗(yàn)信息的對(duì)比依據(jù)。
與現(xiàn)有技術(shù)相比本發(fā)明的優(yōu)點(diǎn)在于:1、使用限制較少,支持絕大多數(shù)擁有攝像頭的安卓平臺(tái)設(shè)備;2、可在錄制時(shí)對(duì)任何不超出視頻尺寸的自定義水印圖片進(jìn)行實(shí)時(shí)添加;3、能夠利用智能設(shè)備的CPU與GPU進(jìn)行視頻添加,不必依賴傳統(tǒng)錄像設(shè)備中專門的視頻編解碼芯片;4、聯(lián)網(wǎng)情況下精確獲取當(dāng)前時(shí)區(qū)的時(shí)間并進(jìn)行精準(zhǔn)的時(shí)間戳水印添加;5、能夠針對(duì)錄制完成的視頻進(jìn)行客觀性校驗(yàn),防止數(shù)據(jù)被篡改及傳輸中出現(xiàn)錯(cuò)誤,保證其客觀性和真實(shí)有效性。
附圖說(shuō)明
圖1為本發(fā)明實(shí)施例的主流程圖;
圖2為本發(fā)明實(shí)施例RBG與YUV420轉(zhuǎn)換后得到的編碼圖;
圖3為本發(fā)明實(shí)施例YUV420轉(zhuǎn)換為android源生視頻支持的NV21格式編碼圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下舉實(shí)施例,對(duì)本發(fā)明做進(jìn)一步詳細(xì)說(shuō)明。
如圖1所示,一種針對(duì)安卓設(shè)備產(chǎn)生的視頻添加水印的方法,包括以下步驟:
S1:安卓設(shè)備源生視頻流的視頻編碼分析;
攝像頭產(chǎn)生的源生視頻數(shù)據(jù)通常為YUV格式。但安卓攝像頭產(chǎn)生的數(shù)據(jù)與其他設(shè)備有所不同,通常在對(duì)安卓攝像頭進(jìn)行調(diào)用時(shí),需要選擇NV21格式的視頻參數(shù)。該參數(shù)則表示使用YUV顏色空間描述視頻幀。這里需要對(duì)安卓原聲視頻幀的特殊的YUV結(jié)構(gòu)進(jìn)行解析,其詳細(xì)步驟如下:
S11:獲取源生視頻幀,為安卓設(shè)備相機(jī)加入預(yù)覽回調(diào),開(kāi)啟相機(jī),并在預(yù)覽回調(diào)中取得視頻幀,該幀即為待分析數(shù)據(jù)。
S12:分離灰度數(shù)據(jù)與顏色數(shù)據(jù),其詳細(xì)步驟如下:
S121:設(shè)獲取到的圖片尺寸為WIDTH*HEIGHT像素;
S122:取數(shù)組中下標(biāo)為0到下標(biāo)為WIDTH*HEIGHT-1的數(shù)據(jù),即為灰度數(shù)據(jù);
S123:將該灰度數(shù)據(jù)輸出成為圖片,則得到無(wú)顏色的黑白圖片,灰度數(shù)據(jù)得以證明;
S124:取數(shù)組中剩余部分,即為顏色數(shù)據(jù)。
S13:分析顏色數(shù)據(jù);
根據(jù)標(biāo)準(zhǔn)YUV420數(shù)據(jù)的存儲(chǔ)方式可知,顏色與灰度數(shù)據(jù)是1對(duì)4的關(guān)系。即從灰度數(shù)據(jù)0位置開(kāi)始,相鄰四個(gè)像素點(diǎn)為一組,由顏色數(shù)據(jù)中從0開(kāi)始的一個(gè)或一組數(shù)據(jù)進(jìn)行控制。同樣設(shè)圖片尺寸為WIDTH*HEIGHT。則可確定,下標(biāo)為0、1、WIDTH,WIDTH+1的灰度數(shù)據(jù),其顏色中V通道為WIDTH*HEIGHT,U通道則為WIDTH*HEIGHT+1,后續(xù)數(shù)據(jù)以此類推;安卓設(shè)備UV分量排布為V0U0,V1U1……VnUn。
S2:將通用RBG色彩空間編碼轉(zhuǎn)換為android源生視頻流編碼YUV格式;
通行色彩空間為RBG,即將圖像每個(gè)像素使用三個(gè)參數(shù)紅藍(lán)綠進(jìn)行描述。為方便對(duì)YUV格式視頻幀進(jìn)行添加,需要將普通的RGB空間顏色轉(zhuǎn)換為YUV格式。其詳細(xì)步驟如下:
S21:RBG數(shù)據(jù)轉(zhuǎn)換為通行YUV420數(shù)據(jù);
首先將RBG數(shù)據(jù)讀入數(shù)組,從第一個(gè)像素開(kāi)始,每三位取一次數(shù)據(jù),即為當(dāng)前像素的RBG數(shù)據(jù)。使用通行的RBG與YUV420轉(zhuǎn)換算法可得相應(yīng)YUV420數(shù)據(jù),轉(zhuǎn)換后獲得的編碼如圖2所示。
S22:YUV420轉(zhuǎn)換為android源生視頻支持的NV21格式,由于YUV420數(shù)據(jù)與androd源生視頻的色彩分量不兼容,因此需要進(jìn)行格式轉(zhuǎn)換。具體的轉(zhuǎn)換算法可以描述為:
S221:灰度部分原樣取值;
S222:提取灰度數(shù)據(jù)后,首先取V數(shù)據(jù)一位,置于灰度數(shù)據(jù)后第一位。再取U數(shù)據(jù)一位,置于一位V數(shù)據(jù)之后,此后VU數(shù)據(jù)均順序取值并交叉排布,保持V0U0V1U1……VnUn的順序即可。
對(duì)圖2所描述的編碼使用上述方法進(jìn)行轉(zhuǎn)換,可以得到圖3所描述的android系統(tǒng)支持的YUV(上面說(shuō)是NV21格式)格式。
S3:本機(jī)時(shí)間校準(zhǔn):時(shí)間校準(zhǔn)是實(shí)時(shí)錄制的基礎(chǔ),準(zhǔn)確且真實(shí)的時(shí)間才能夠用于視頻的時(shí)間戳添加;本方法要求android設(shè)備能夠訪問(wèn)互聯(lián)網(wǎng)。通常情況下,應(yīng)用無(wú)法直接設(shè)置android系統(tǒng)時(shí)間,因此本專利設(shè)計(jì)了一套簡(jiǎn)易且有效的時(shí)間校準(zhǔn)機(jī)制;具體步驟如下:
S31:定義時(shí)間偏移存儲(chǔ)位,在Constants文件中定義靜態(tài)全局變量DATE_OFFSET,用于存儲(chǔ)時(shí)間偏移量;該偏移量表示本機(jī)的時(shí)間與網(wǎng)絡(luò)時(shí)間之間的差值;
S32:獲取網(wǎng)絡(luò)時(shí)間與時(shí)間偏移步驟如下:
S321:調(diào)用URLConntection訪問(wèn)國(guó)家授時(shí)中心服務(wù)器,獲取數(shù)據(jù)并解析。這里獲取到的數(shù)據(jù)是以毫秒為單位的時(shí)間數(shù)據(jù)。
S322:計(jì)算時(shí)間偏移量,使用系統(tǒng)System.currentMillis()獲取本機(jī)時(shí)間,計(jì)算本機(jī)時(shí)間與網(wǎng)絡(luò)時(shí)間的差值,存儲(chǔ)至偏移存儲(chǔ)位;該值為帶符號(hào)長(zhǎng)整型。
S33:定義真實(shí)時(shí)間,定義getCurrentDate方法,使用系統(tǒng)當(dāng)前時(shí)間作為基準(zhǔn),與時(shí)間偏移值相加,獲得當(dāng)前的真實(shí)時(shí)間,并使用Data對(duì)象將其轉(zhuǎn)換成為YYYY-MM-DD HH:MM:SS形式,返回給調(diào)用者。
S4:自定義水印實(shí)時(shí)添加
水印實(shí)時(shí)添加需要用到上述S1、S2兩大步驟的成果。該步驟有兩個(gè)分支,一為文字添加,二為圖像添加。在對(duì)視頻幀進(jìn)行獲取并添加水印后,將幀送入視頻編碼及混合器,進(jìn)行轉(zhuǎn)碼與輸出。具體步驟如下:
S41:文字添加步驟如下:
S411:獲得文字點(diǎn)陣編碼,使用通行的文字點(diǎn)陣轉(zhuǎn)換算法,將待轉(zhuǎn)換文字轉(zhuǎn)換為描述點(diǎn)陣的數(shù)組;該點(diǎn)陣數(shù)組即為待添加水印的Y數(shù)據(jù),存儲(chǔ)成名為preText的byte數(shù)組。
S412:定義文字顏色UV值,這里需要將待添加的文字顏色從RBG的描述方式轉(zhuǎn)換為UV的描述方式。由于Y數(shù)據(jù)已經(jīng)存在,此時(shí)只需將待添加的顏色的RBG值轉(zhuǎn)換為YUV值即可。
這里將通行的YUV算法進(jìn)行改進(jìn),擯棄計(jì)算獲得的Y通道,僅留存UV通道的值;最終獲得一個(gè)U值和一個(gè)V值。
S413:獲取待添加視頻幀并進(jìn)行添加,這里設(shè)將待添加水印添加至視頻的x,y位置,即從視頻幀的x,y位置開(kāi)始添加水印。
其步驟如下:
S4131:為相機(jī)添加回調(diào)接口,在回調(diào)接口的getFrameData方法中實(shí)時(shí)獲取到錄制的視頻幀,并存成名為src的byte數(shù)組;
S4132:將獲取到的src數(shù)組的內(nèi)存地址映射到底層的JNI中;
S4133:將指向src的指針p偏移至待添加位置,根據(jù)開(kāi)始添加前指定的偏移x,y,將指針p移至y*WIDTH+x位置,即在p的值上累加y*WIDTH+x;
S4134:從當(dāng)前p所指偏移位置開(kāi)始,遍歷src數(shù)組內(nèi)存區(qū)域中的數(shù)據(jù),同時(shí)遍歷步驟S411中獲取到的preText點(diǎn)陣編碼;當(dāng)preText數(shù)組遍歷到非0x00的數(shù)據(jù)時(shí),將preText相應(yīng)位置的數(shù)據(jù)寫(xiě)入p指針當(dāng)前位置的內(nèi)存中,重復(fù)上述操作直至preText數(shù)組遍歷結(jié)束。
S4135:在Y通道添加完后,根據(jù)S22中獲取到的視頻幀的排布規(guī)律,計(jì)算出src數(shù)組該位置的UV數(shù)據(jù)的地址,將S412獲取到的U和V數(shù)據(jù)寫(xiě)到相應(yīng)位置,V的地址可以根據(jù)p+y*WIDTH/2+x計(jì)算,U的地址則為V+1。
需要注意的是步驟S4134和S4135必須同時(shí)進(jìn)行。
S42圖像添加,具體步驟如下:
S421:圖像編碼數(shù)組的獲取
首先使用通用的方法或工具將待添加圖片轉(zhuǎn)換成為bmp格式圖像,然后去除獲得的bmp圖像的頭;Bmp圖像前56位為頭信息,讀取從第57位開(kāi)始的其余數(shù)據(jù)進(jìn)入內(nèi)存,放置在prePic數(shù)組中;即可得到待添加的圖像的YUV數(shù)據(jù)。
S422:獲取待添加視頻幀并進(jìn)行添加,其詳細(xì)步驟如下:
S4231:為相機(jī)添加回調(diào)接口,在回調(diào)接口的getFrameData方法中實(shí)時(shí)獲取到錄制的視頻幀,并存成名為src的byte數(shù)組;
S4232:將獲取到的src數(shù)組的內(nèi)存地址映射到底層的JNI中;
S4233:將指向src的指針p偏移至待添加位置,根據(jù)開(kāi)始添加前指定的偏移x,y,將指針p移至y*WIDTH+x位置,即在p的值上累加y*WIDTH+x;
S4234:設(shè)待疊加圖像尺寸為W*H,若prePic當(dāng)前位置數(shù)據(jù)不為0x00或0xff,則將prePic當(dāng)前位置的數(shù)據(jù)寫(xiě)入同步遞增的p指針?biāo)傅膕rc數(shù)組的相應(yīng)位置,直至遍歷至prePic的W*H-1位置時(shí)結(jié)束;
S4235:向src寫(xiě)入數(shù)據(jù)后,取得prePic當(dāng)前像素的U和V數(shù)據(jù),并將該數(shù)據(jù)寫(xiě)入src相應(yīng)位置Y數(shù)據(jù)所屬的UV分量上,然后繼續(xù)遍歷直至完成遍歷。
S5時(shí)間戳實(shí)時(shí)添加,詳細(xì)步驟如下:
S51:獲取校準(zhǔn)時(shí)間,通過(guò)S3中所屬方法獲得當(dāng)前的時(shí)間,并轉(zhuǎn)換成為字符串,待添加;
S52:構(gòu)建常用文字點(diǎn)陣映射數(shù)組,為保證實(shí)時(shí)性,盡量減少水印添加過(guò)程中的數(shù)據(jù)處理時(shí)間,提高實(shí)時(shí)性,預(yù)先將時(shí)間戳添加所需數(shù)字和符號(hào)轉(zhuǎn)換為編碼數(shù)組,并以ascii碼作為索引,編譯成靜態(tài)常量,供添加過(guò)程中檢索并直接使用,這里可以定義每個(gè)字符的點(diǎn)陣大小,這里使用n*n描述其大小。
S53:時(shí)間戳水印添加,其詳細(xì)步驟如下:
S531:將獲取到的經(jīng)校準(zhǔn)的時(shí)間字符串的地址映射到JNI層;
S532:將字符串中每個(gè)字符編碼轉(zhuǎn)換為ascii值,并查表獲得每個(gè)字符的點(diǎn)陣數(shù)組;
S533:循環(huán)遍歷字符串,將點(diǎn)陣數(shù)組使用S413所描述的步驟疊加至視頻幀中,并將下次疊加的偏移量的x值增加n。直至遍歷完成。為增加實(shí)時(shí)性,可將文字疊加中UV疊加的步驟省略,即僅對(duì)Y通道的數(shù)據(jù)進(jìn)行疊加,不再計(jì)算UV通道的地址,也不對(duì)UV通道進(jìn)行疊加,從而節(jié)省時(shí)間增加時(shí)效性。
S6:視頻校驗(yàn),詳細(xì)步驟如下:
S61:完整性視頻摘要信息獲?。?/p>
主要用于完成客觀性校驗(yàn)與防篡改檢測(cè)。這里我們使用兩種不同的校驗(yàn)算法,以滿足不同嚴(yán)格程度的使用場(chǎng)景。以下兩種獲取途徑,根據(jù)具體需要可相互替代。
通過(guò)MD5信息摘要算法獲得校驗(yàn)字符串;
如果需要以較快的速度獲取文件的校驗(yàn)信息,可以使用MD5算法對(duì)文件的校驗(yàn)信息進(jìn)行獲取。以二進(jìn)制數(shù)據(jù)流讀取的方式,從指定的視頻文件中讀取數(shù)據(jù),使用公開(kāi)通行的DM5計(jì)算方法,獲取整個(gè)視頻文件的MD5值,記為verify_str。
通過(guò)hash256信息摘要算法獲得校驗(yàn)字符串;
為進(jìn)一步提高校驗(yàn)字符串的可靠性,可以選用更為嚴(yán)格但更耗時(shí)的HASH256信息摘要算法,對(duì)已經(jīng)生成的文件做校驗(yàn)信息生成。以二進(jìn)制數(shù)據(jù)流讀取的方式,從指定的視頻文件頭部開(kāi)始讀取數(shù)據(jù),使用公開(kāi)通行的HASH256計(jì)算方法,獲取整個(gè)視頻文件的HASH256值,記為verify_str。
S62:視頻導(dǎo)出過(guò)程中分段傳輸并校驗(yàn);
視頻導(dǎo)出時(shí),為防止導(dǎo)出過(guò)程中因?yàn)閿?shù)據(jù)傳輸錯(cuò)誤導(dǎo)致完整度缺失,本方法在導(dǎo)處過(guò)程中對(duì)導(dǎo)出數(shù)據(jù)進(jìn)行分段校驗(yàn),以此保證傳輸數(shù)據(jù)的完整性和正確性。其步驟如下:
S621:指定byte數(shù)組buffer,長(zhǎng)度x。從視頻文件頭部起始位置開(kāi)始,讀取后續(xù)的x長(zhǎng)度數(shù)據(jù)到buffer中;
S622:將buffer中的數(shù)據(jù)使用MD5或HASH256獲取這段數(shù)據(jù)的信息摘要,記作src_verify_str;
S623:將buffer中數(shù)據(jù)寫(xiě)入目標(biāo)文件,并從目標(biāo)文件中獲取到該段數(shù)據(jù)的拷貝,對(duì)這段數(shù)據(jù)進(jìn)行MD5或HASH256計(jì)算,獲得其摘要,記作dest_verify_str;
S624:對(duì)比src_verify_str與dest_verify_str是否一致,一致則繼續(xù)下一次讀取,否則重新讀取該段數(shù)據(jù),直至文件被遍歷完。
S63:導(dǎo)出后視頻有效性校驗(yàn);
該步驟主要用于文件轉(zhuǎn)移或傳輸后驗(yàn)證其可靠性。其步驟與S61所述一致,最終獲得該視頻的校驗(yàn)信息final_verify_str。然后將該校驗(yàn)信息與S61中獲得的verify_str做對(duì)比,一致則表示該視頻完整且可靠。
為提升校驗(yàn)信息的可靠性和有效性,使用云端存儲(chǔ)校驗(yàn)信息,并提供校驗(yàn)信息在線獲取功能,通過(guò)這樣的方式保證校驗(yàn)信息不可篡改或刪除。
1、在S61流程結(jié)束后將MD5或HASH256摘要信息存儲(chǔ)至云端服務(wù)器中,并將視頻信息與校驗(yàn)信息做映射。
2、在S63步驟開(kāi)始前,從云端獲取到指定的數(shù)據(jù),獲取到摘要信息,作為校驗(yàn)信息的對(duì)比依據(jù)。
本領(lǐng)域的普通技術(shù)人員將會(huì)意識(shí)到,這里所述的實(shí)施例是為了幫助讀者理解本發(fā)明的實(shí)施方法,應(yīng)被理解為本發(fā)明的保護(hù)范圍并不局限于這樣的特別陳述和實(shí)施例。本領(lǐng)域的普通技術(shù)人員可以根據(jù)本發(fā)明公開(kāi)的這些技術(shù)啟示做出各種不脫離本發(fā)明實(shí)質(zhì)的其它各種具體變形和組合,這些變形和組合仍然在本發(fā)明的保護(hù)范圍內(nèi)。