宋燕燕,秦 軍
(中國傳媒大學南廣學院,江蘇 南京 211172)
計算機與網絡信息技術的快速發(fā)展,促使當今社會進入了網絡信息時代,各個領域的數(shù)據(jù)和信息急劇增多。數(shù)字媒體的安全問題也極大地制約了當前信息化進程,數(shù)據(jù)的版權保護問題日益凸顯,因此數(shù)字水印技術應運而生。數(shù)字水印技術是將一些標識信息直接嵌入在數(shù)字媒體元素中,且不影響原載體的使用價值。數(shù)字水印是保護信息安全、實現(xiàn)防偽溯源、版權保護的有效辦法[1]。當前的媒體形式中,最能吸引眼球的是視頻文件,如何對視頻文件進行有效保護已經成為十分迫切的研究課題。視頻的格式有很多種,所以,相同的水印算法在不同種視頻中,并不一定兼容。文中設計的系統(tǒng)的意義在于,可以根據(jù)不同的編碼過程在程序中加以調整,使得在同一個平臺上進行多種格式視頻水印的嵌入和提取,避免了給不同格式的視頻單獨調用編解碼庫構建仿真平臺的麻煩。實現(xiàn)了一種基于FFMPEG的視頻水印系統(tǒng),使得各種編碼格式的視頻水印算法都能在同一個仿真平臺通用。
FFMPEG是一套可以用來記錄、轉換數(shù)字音頻、視頻,并能將其轉化為流的開源計算機程序。它提供了錄制、轉換以及編解碼功能的完整解決方案[2-5],包含了非常先進的音頻/視頻編解碼庫libavcodec。為了保證高可移植性和編解碼質量,libavcodec里很多編解碼方式都是從頭開發(fā)的[6-9]。
FFMPEG支持MPEG,DivX,MPEG -4,AC3,DV,F(xiàn)LV等40多種編碼,以及AVI、MPEG、OGG、Matroska、ASF等90多種解碼,涵蓋了多種音視頻格式。FFMPEG也支持常見的圖像色彩空間,并且在libavswcale中定義了色彩空間轉換的相關函數(shù),實現(xiàn)了各種色彩模式的相互轉換[10-12]。
SDL(simple direct-media layer)是一套開放源代碼的跨平臺多媒體開發(fā)庫,使用C語言編寫。SDL提供了數(shù)種控制圖像、聲音、輸出、輸入的函數(shù),讓開發(fā)者只要用相同或相似的代碼就可以開發(fā)出跨多個平臺(Linux、Windows、Mac OS X等)的應用軟件。目前SDL多用于開發(fā)游戲、模擬器、媒體播放器等多媒體應用領域[13-15]。
視頻水印系統(tǒng)主要分為三個模塊:輸入模塊、處理模塊和輸出模塊,各模塊之間通過調用各個接口進行交互,使得功能更加完善,使用起來更加契合[11]。
1.輸入模塊。
(1)內存管理。
內存管理的主要功能就是將選中的視頻文件信息寫入內存,并且通過一系列的操作將視頻數(shù)據(jù)提供給FFMEPG的解碼器。
(2)解碼。
解碼主要是對視頻解碼,文中對音頻信息不作處理。視頻解碼主要的內容就是將之前存入內存的數(shù)據(jù)信息通過FFMPEG的解碼器進行解碼,解碼完成后送給SDL。并且利用SDL進行YUV數(shù)據(jù)顯示。
(3)渲染紋理。
負責把利用FFMPEG解碼獲得的YUV數(shù)據(jù)渲染到紋理中,再拷貝到渲染器,實現(xiàn)視頻成功顯示。
2.處理模塊。
利用FFMPEG中的過濾器的各種方法,給視頻加“特效”,而文中的特效就是圖片水印。FFMPEG的libavfilter類庫提供了大量的視音頻過濾器,種類繁多,有很多現(xiàn)成的filter可以直接使用,也給大家研究視頻播放器帶來了許多便捷。文中是在FFMPEG的libavfilter類庫的基礎上完成一個水印疊加器,利用Visual Studio 2015平臺加以實現(xiàn)。
可以將一張透明背景的圖片作為水印疊加到一個視頻文件上。需要注意的是,其疊加工作是在解碼后的YUV像素數(shù)據(jù)的基礎上完成的。程序支持使用SDL顯示疊加后的YUV數(shù)據(jù),也可以將疊加后的YUV輸出成文件。
3.輸出模塊。
利用FFMPEG中封裝好的代碼,實現(xiàn)視頻的輸出。系統(tǒng)方案如圖1所示。
圖1 系統(tǒng)方案
每個視頻都有自己的封裝格式,而所謂封裝格式,也就是視頻的類型。比如:MP4、TS等。也就是說,在每個視頻的封裝格式中,都包含此視頻的各種信息,比如視頻流和音頻流等。對于有封裝格式的視頻,需要先從中提取出視頻流,然后通過解碼器解碼。例如解碼TS格式的視頻文件,就是“TS→H.264碼流→YUV”[4]。視頻流解碼流程如圖2所示。
圖2 視頻流解碼流程
(1)首先設定函數(shù)av_register_all()進行初始化,再設定avformat_open_input()方法打開文件,獲取視頻文件的封裝格式信息。其中需要判斷打開是否成功,如果不成功則顯示“無法打開視頻文件”。
(2)使用for循環(huán),判斷流信息中哪個是視頻流信息,哪個是音頻流信息;找到視頻流后,尋找解碼器;找到解碼器后,使用avcodec_open2()打開解碼器。
(3)定義方法av_read_frame()獲取封裝格式AVPacker信息,再使用Avcodec_decode_video2()方法解碼AVPacker信息。若沒有獲取到AVPacker信息,則停止運行。
(4)若獲取到了AVPacker信息,則使用av_malloc()方法將YUV格式信息從內存中取出,填充到pAVFrameYUV中。
視頻文件經過解碼、渲染等一系列工序之后,要將水印文件添加到視頻文件上。FFMPEG自帶的類庫中含有大量的過濾器,這些過濾器可以將一些文件信息轉碼。
AVFilter的基本處理流程如下:
(1)avfilter_register_all():注冊。
avfilter_graph_alloc():分配一個AVFilterGraph。
(2)創(chuàng)建AVFilterContext。
avfilter_graph_create_filter():創(chuàng)建filter。
(3)重復以上兩步,創(chuàng)建一個source,一個sink。
avfilter_graph_parse_ptr():將一串通過字符串描述的Graph添加到AVFilterGraph中。
avfilter_graph_config():檢查FilterGraph的配置。
av_buffersrc_add_frame():向FilterGraph中加入一個AVFrame。
av_buffersink_get_frame():從AVFilterGraph中取出一個AVFrame。
(4)重復以上兩步,加入一個AVFrame處理AVFrame,取出AVFrame。
以上就是AVFilter的處理流程,其他特效通過avfilter_graph_parse_ptr(filter_graph,filters_descr,&inputs,&outputs,NULL)中filters_descr這個字符串來決定,調用FFMPEG提供的方法和傳入了符合格式的過濾字串。
具體流程如圖3所示。
圖3 視頻水印添加流程
基于FFMPEG的視頻水印系統(tǒng)已完成,系統(tǒng)運行環(huán)境:Windows 2007系統(tǒng);平臺:Visual Studio 2015。
首先在Visual Studio中運行系統(tǒng),如圖4所示,可以看到左部的圖片是默認圖片,點擊“打開文件”,選擇一個視頻文件進行添加,而文中選擇了一部后綴名為.ts的視頻進行添加,視頻添加后左部默認圖片會變成視頻文件的首幀畫面。
點擊“播放”按鈕,視頻可以正常播放,而點擊“暫?!卑粹o,視頻文件會停在當前幀,點擊“停止”按鈕,視頻會停止播放并且恢復到默認圖片。
實現(xiàn)一張水印圖片,點擊“選擇水印”按鈕,選中該圖片,選中后會呈現(xiàn)于界面上,用戶可以查看是否選擇正確。
點擊“加水印”按鈕,系統(tǒng)會自動將圖片水印加入視頻文件畫面中,并且添加完畢會自動導出到項目文件,導出的視頻格式類型是.yuv。并且在添加完成后,會有彈框提示,提醒用戶已經完成水印添加,并且已經導出。
圖4 運行結果
從數(shù)字媒體元素版權保護需求出發(fā)探討了視頻水印系統(tǒng)設計方案,利用FFMPEG編解碼庫解決視頻水印算法中的編解碼問題,實現(xiàn)H.264的視頻解碼功能,包括ts、mp4等視頻格式。提出了FFMPEG轉碼圖形用戶界面的具體實現(xiàn)方法,介紹了FFMPEG轉碼加密模塊的流程、函數(shù)調用關系、具體加密算法的實現(xiàn)和視頻播放模塊的具體實現(xiàn)。利用模塊化思想,為不同編碼格式的視頻水印算法提供一個通用平臺,對視頻的版權保護起到了積極作用,具有一定的現(xiàn)實意義和參考價值。
參考文獻:
[1] CHANG X,WANG W,ZHAO J,et al.A survey of digital video watermarking[C]//Seventh international conference on natural computation.[s.l.]:[s.n.],2011:61-65.
[2] 任 嚴,韓 臻,劉 麗.基于FFMPEG的視頻轉換與發(fā)布系統(tǒng)[J].計算機工程與設計,2007,28(20):4962-4963.
[3] 王 彤.基于FFmpeg的H.264解碼器實現(xiàn)[D].大連:大連理工大學,2011.
[4] CHENG Yun,LIU Qingtang,ZHAO Chengling,et al.Design and implementation of mediaplayer based on FFmpeg[J].Software Engineering and Knowledge Engineering,2012,2:867-874.
[5] ZENG Hao,FANG Yuan.Implementation of video transcoding client based on FFMPEG[J].Advanced Materials Research,2013,756-759:1748-1752.
[6] 辛長春,婁小平,呂乃光.基于FFmpeg的遠程視頻監(jiān)控系統(tǒng)編解碼[J].電子技術,2013(1):3-5.
[7] 張國慶.基于FFmpeg的視頻轉碼與保護系統(tǒng)的設計與實現(xiàn)[D].武漢:華中師范大學,2011.
[8] 李芳芳,蘇凱雄.基于FFmpeg的H.264格式轉換器的設計與實現(xiàn)[J].電視技術,2016,40(7):32-35.
[9] 胡 聰,周 甜,唐璐丹.基于FFMPEG的跨平臺視頻編解碼研究[J].武漢理工大學學報.2011,33(11):139-142.
[10] 吳 岳,施惠娟.基于FFMPEG的視頻水印系統(tǒng)[J].電子設計工程,2013,21(23):185-187.
[11] 胡 成,任平安,李文莉.基于Android系統(tǒng)的FFmpeg多媒體同步傳輸算法研究[J].計算機技術與發(fā)展,2011,21(10):85-87.
[12] LI Chengbo,JIANG Hong,WILFORD P,et al.Video coding using compressive sensing for wireless communications[C]//WCNC 2011.[s.l.]:IEEE,2011:2077-2082.
[13] 李 科,李 璐,蘭時勇.基于FFmpeg和SDL實現(xiàn)多路實時流變換及播放[J].計算機技術與發(fā)展,2014,24(4):65-68.
[14] 汪俊杰,王志明.基于SDL的H.264流媒體播放系統(tǒng)[J].計算機系統(tǒng)應用,2013,22(12):51-54.
[15] DUAN H,NG B P,CHONG M S S,et al.Applications of the SRV constraint in broadband pattern synthesis[J].Signal Processing,2008,88(4):1035-1045.