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