宋燕燕,秦 軍
(中國傳媒大學南廣學院,江蘇 南京 211172)
計算機與網絡信息技術的快速發展,促使當今社會進入了網絡信息時代,各個領域的數據和信息急劇增多。數字媒體的安全問題也極大地制約了當前信息化進程,數據的版權保護問題日益凸顯,因此數字水印技術應運而生。數字水印技術是將一些標識信息直接嵌入在數字媒體元素中,且不影響原載體的使用價值。數字水印是保護信息安全、實現防偽溯源、版權保護的有效辦法[1]。當前的媒體形式中,最能吸引眼球的是視頻文件,如何對視頻文件進行有效保護已經成為十分迫切的研究課題。視頻的格式有很多種,所以,相同的水印算法在不同種視頻中,并不一定兼容。文中設計的系統的意義在于,可以根據不同的編碼過程在程序中加以調整,使得在同一個平臺上進行多種格式視頻水印的嵌入和提取,避免了給不同格式的視頻單獨調用編解碼庫構建仿真平臺的麻煩。實現了一種基于FFMPEG的視頻水印系統,使得各種編碼格式的視頻水印算法都能在同一個仿真平臺通用。
FFMPEG是一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序。它提供了錄制、轉換以及編解碼功能的完整解決方案[2-5],包含了非常先進的音頻/視頻編解碼庫libavcodec。為了保證高可移植性和編解碼質量,libavcodec里很多編解碼方式都是從頭開發的[6-9]。
FFMPEG支持MPEG,DivX,MPEG -4,AC3,DV,FLV等40多種編碼,以及AVI、MPEG、OGG、Matroska、ASF等90多種解碼,涵蓋了多種音視頻格式。FFMPEG也支持常見的圖像色彩空間,并且在libavswcale中定義了色彩空間轉換的相關函數,實現了各種色彩模式的相互轉換[10-12]。
SDL(simple direct-media layer)是一套開放源代碼的跨平臺多媒體開發庫,使用C語言編寫。SDL提供了數種控制圖像、聲音、輸出、輸入的函數,讓開發者只要用相同或相似的代碼就可以開發出跨多個平臺(Linux、Windows、Mac OS X等)的應用軟件。目前SDL多用于開發游戲、模擬器、媒體播放器等多媒體應用領域[13-15]。
視頻水印系統主要分為三個模塊:輸入模塊、處理模塊和輸出模塊,各模塊之間通過調用各個接口進行交互,使得功能更加完善,使用起來更加契合[11]。
1.輸入模塊。
(1)內存管理。
內存管理的主要功能就是將選中的視頻文件信息寫入內存,并且通過一系列的操作將視頻數據提供給FFMEPG的解碼器。
(2)解碼。
解碼主要是對視頻解碼,文中對音頻信息不作處理。視頻解碼主要的內容就是將之前存入內存的數據信息通過FFMPEG的解碼器進行解碼,解碼完成后送給SDL。并且利用SDL進行YUV數據顯示。
(3)渲染紋理。
負責把利用FFMPEG解碼獲得的YUV數據渲染到紋理中,再拷貝到渲染器,實現視頻成功顯示。
2.處理模塊。
利用FFMPEG中的過濾器的各種方法,給視頻加“特效”,而文中的特效就是圖片水印。FFMPEG的libavfilter類庫提供了大量的視音頻過濾器,種類繁多,有很多現成的filter可以直接使用,也給大家研究視頻播放器帶來了許多便捷。文中是在FFMPEG的libavfilter類庫的基礎上完成一個水印疊加器,利用Visual Studio 2015平臺加以實現。
可以將一張透明背景的圖片作為水印疊加到一個視頻文件上。需要注意的是,其疊加工作是在解碼后的YUV像素數據的基礎上完成的。程序支持使用SDL顯示疊加后的YUV數據,也可以將疊加后的YUV輸出成文件。
3.輸出模塊。
利用FFMPEG中封裝好的代碼,實現視頻的輸出。系統方案如圖1所示。

圖1 系統方案
每個視頻都有自己的封裝格式,而所謂封裝格式,也就是視頻的類型。比如:MP4、TS等。也就是說,在每個視頻的封裝格式中,都包含此視頻的各種信息,比如視頻流和音頻流等。對于有封裝格式的視頻,需要先從中提取出視頻流,然后通過解碼器解碼。例如解碼TS格式的視頻文件,就是“TS→H.264碼流→YUV”[4]。視頻流解碼流程如圖2所示。

圖2 視頻流解碼流程
(1)首先設定函數av_register_all()進行初始化,再設定avformat_open_input()方法打開文件,獲取視頻文件的封裝格式信息。其中需要判斷打開是否成功,如果不成功則顯示“無法打開視頻文件”。
(2)使用for循環,判斷流信息中哪個是視頻流信息,哪個是音頻流信息;找到視頻流后,尋找解碼器;找到解碼器后,使用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)創建AVFilterContext。
avfilter_graph_create_filter():創建filter。
(3)重復以上兩步,創建一個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的視頻水印系統已完成,系統運行環境:Windows 2007系統;平臺:Visual Studio 2015。
首先在Visual Studio中運行系統,如圖4所示,可以看到左部的圖片是默認圖片,點擊“打開文件”,選擇一個視頻文件進行添加,而文中選擇了一部后綴名為.ts的視頻進行添加,視頻添加后左部默認圖片會變成視頻文件的首幀畫面。
點擊“播放”按鈕,視頻可以正常播放,而點擊“暫?!卑粹o,視頻文件會停在當前幀,點擊“停止”按鈕,視頻會停止播放并且恢復到默認圖片。
實現一張水印圖片,點擊“選擇水印”按鈕,選中該圖片,選中后會呈現于界面上,用戶可以查看是否選擇正確。
點擊“加水印”按鈕,系統會自動將圖片水印加入視頻文件畫面中,并且添加完畢會自動導出到項目文件,導出的視頻格式類型是.yuv。并且在添加完成后,會有彈框提示,提醒用戶已經完成水印添加,并且已經導出。

圖4 運行結果
從數字媒體元素版權保護需求出發探討了視頻水印系統設計方案,利用FFMPEG編解碼庫解決視頻水印算法中的編解碼問題,實現H.264的視頻解碼功能,包括ts、mp4等視頻格式。提出了FFMPEG轉碼圖形用戶界面的具體實現方法,介紹了FFMPEG轉碼加密模塊的流程、函數調用關系、具體加密算法的實現和視頻播放模塊的具體實現。利用模塊化思想,為不同編碼格式的視頻水印算法提供一個通用平臺,對視頻的版權保護起到了積極作用,具有一定的現實意義和參考價值。
參考文獻:
[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的視頻轉換與發布系統[J].計算機工程與設計,2007,28(20):4962-4963.
[3] 王 彤.基于FFmpeg的H.264解碼器實現[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的遠程視頻監控系統編解碼[J].電子技術,2013(1):3-5.
[7] 張國慶.基于FFmpeg的視頻轉碼與保護系統的設計與實現[D].武漢:華中師范大學,2011.
[8] 李芳芳,蘇凱雄.基于FFmpeg的H.264格式轉換器的設計與實現[J].電視技術,2016,40(7):32-35.
[9] 胡 聰,周 甜,唐璐丹.基于FFMPEG的跨平臺視頻編解碼研究[J].武漢理工大學學報.2011,33(11):139-142.
[10] 吳 岳,施惠娟.基于FFMPEG的視頻水印系統[J].電子設計工程,2013,21(23):185-187.
[11] 胡 成,任平安,李文莉.基于Android系統的FFmpeg多媒體同步傳輸算法研究[J].計算機技術與發展,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實現多路實時流變換及播放[J].計算機技術與發展,2014,24(4):65-68.
[14] 汪俊杰,王志明.基于SDL的H.264流媒體播放系統[J].計算機系統應用,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.