本發(fā)明屬于安全防護(hù)領(lǐng)域,涉及到視頻壓縮傳輸技術(shù),更確切的說是一種基于H264編碼的視頻壓縮傳輸技術(shù)。
背景技術(shù):
以一張中等分辨率的圖片(分辨率為800*600,24比特每像素)為例,則每采取這樣一副圖片所需要的比特?cái)?shù)為600"800"24=11.52Mb(兆比特),大約占1.4MB(兆字節(jié))的存儲空間。如果按照30fps(幀每秒)的幀率來計(jì)算,每秒鐘需要傳輸?shù)臄?shù)據(jù)量為345.6Mb。如果作為多媒體信息由計(jì)算機(jī)來處理,則無論從總線傳輸速率、數(shù)據(jù)存取和交換速率還是網(wǎng)絡(luò)傳輸速率,目前都無法達(dá)到如此高的要求。圖像只有必須經(jīng)過數(shù)據(jù)壓縮處理,計(jì)算機(jī)才有可能具備處理這種信息的能力。
為了實(shí)現(xiàn)各種網(wǎng)絡(luò)和多媒體系統(tǒng)的互通互聯(lián),解決視頻信息與用戶交互的問題,關(guān)鍵在于產(chǎn)生一種新的視頻壓縮算法,對視頻信息進(jìn)行更為有效的壓縮,使其壓縮后的碼流能夠滿足用戶在當(dāng)前網(wǎng)絡(luò)環(huán)境下進(jìn)行的實(shí)時(shí)傳輸處理種存儲。
作為模擬或者數(shù)模混合信號電路的基本模塊,模擬基準(zhǔn)電壓源的主要功能就是為電路提供穩(wěn)定的偏置,因此基準(zhǔn)電壓源的性能將直接影響整個(gè)電路系統(tǒng)的精度和性能。隨著集成電路規(guī)模的不斷擴(kuò)大,以及便攜式電子系統(tǒng)的普遍應(yīng)用,使基準(zhǔn)電路再被廣泛應(yīng)用的同時(shí),也對它的性能提出了更高的要求。
H264就是基于這個(gè)背景下產(chǎn)生的新一代視頻壓縮編碼國際標(biāo)準(zhǔn),它是由國際電信聯(lián)合會ITU視頻編碼專家組VCEG和國際化標(biāo)準(zhǔn)組織運(yùn)動圖像專家組MPEG共同組成的聯(lián)合視頻組JVT聯(lián)合制定的,憑借相對其它標(biāo)準(zhǔn)有較高的壓縮效率和優(yōu)秀的圖像質(zhì)量,已經(jīng)成為目前最流行的視頻處理協(xié)議,具有廣闊的前景和巨大的應(yīng)用價(jià)值。
目前,H.264的開源解碼器軟件主要有:德國HHI研究所負(fù)責(zé)開發(fā)的H.264官方測試軟件JM,由法國巴黎中心學(xué)校的中心研究所的學(xué)生發(fā)起的,網(wǎng)上自由 組織聯(lián)合開發(fā)的兼容264標(biāo)準(zhǔn)碼流的編碼器x264,以及中國視頻編碼自由組織聯(lián)合開發(fā)T264等。對比之下,x264注重實(shí)用,在不明顯降低編碼性能的前提下,努力降低編碼的重復(fù)計(jì)算復(fù)雜度,摒棄了H.264標(biāo)準(zhǔn)中一些對編碼性能貢獻(xiàn)微小但計(jì)算復(fù)雜度極高的新特性如多參考幀。所以我們采用x264版本的H264編碼庫。
盡管具有以前很多標(biāo)準(zhǔn)無法比擬的優(yōu)點(diǎn),但H.264標(biāo)準(zhǔn)復(fù)雜度高,用一般的圖像處理芯片難以達(dá)到實(shí)時(shí)編解碼的要求。當(dāng)前,主流式嵌入式平臺(ARM,DSP)的發(fā)展很大程度上解決了這個(gè)問題。目前,基于單片嵌入式處理器的解決方案主要有基于ARM+DSP的雙核處理器,它以美國德州儀器公司(TI)的OMAP系列處理器為主流,使用ARM復(fù)雜系統(tǒng)運(yùn)行,使用DSP核用于視頻解碼,特別將H.264在高速DSP平臺上實(shí)時(shí)實(shí)現(xiàn)是當(dāng)前圖像通信研究領(lǐng)域的一個(gè)熱點(diǎn)問題。同時(shí),由于ARM芯片的多媒體處理能力增強(qiáng),利用ARM實(shí)現(xiàn)H.264也成為現(xiàn)實(shí)。以英特爾公司(Intel)的XscalePXA27x系列為主流,從工藝、指令集、流水線、存儲系統(tǒng)、分支預(yù)測、多媒體應(yīng)用這五個(gè)方面對ARM進(jìn)行了改進(jìn)和優(yōu)化,大大提升了處理器的多媒體處理能力。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明主要采用了ARM9的S3C2440,將linux與H.264相結(jié)合,實(shí)現(xiàn)x264和ffmpeg的移植,對實(shí)際嵌入式視頻通信系統(tǒng)的設(shè)計(jì)開發(fā),具有重要意義和實(shí)用價(jià)值。
本發(fā)明的技術(shù)方案為:對于ARM平臺從軟件的角度看可以分為4個(gè)部分:1、引導(dǎo)加載程序,包括固化在固件中的boot代碼和BootLoader兩大部分,我們需要完成該部分代碼的移植。2、Linux內(nèi)核,特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動參數(shù),我們需要將Linux內(nèi)核編譯移植到我們開發(fā)板上。3、文件系統(tǒng),包括根文件系統(tǒng)和建立于Flash內(nèi)存設(shè)備之上文件系統(tǒng)。通常用Busybox來作為rootfs,yaffs作為Flash上的文件系統(tǒng)。4、用戶應(yīng)用程序,需要編寫特定于用戶的應(yīng)用程序,完成對視頻的壓縮和傳輸。對于PC客戶端,我們需要在客戶端設(shè)計(jì)基于ffmpeg來實(shí)現(xiàn)一個(gè)多路H.264解碼播放器。從而實(shí)現(xiàn)對視頻的實(shí)時(shí)監(jiān)控。對于視頻采集端,我們在開發(fā)板上連接一個(gè)USB攝像頭,該攝像頭在ARM開 發(fā)板的驅(qū)動下即可完成對視頻的采集。
附圖說明
圖1為整個(gè)視頻系統(tǒng)的結(jié)構(gòu)圖。
圖2為在ARM建立視頻壓縮傳輸平臺的流程。
圖3為本發(fā)明在電腦端監(jiān)視主程序的實(shí)現(xiàn)流程。
具體實(shí)施方式
首先在宿主機(jī)上建立交叉編譯環(huán)境,其次移植linux的引導(dǎo)程序到目標(biāo)板,然后構(gòu)建嵌入式Linux系統(tǒng)并移植到目標(biāo)板,從而實(shí)現(xiàn)視頻壓縮處理傳輸模塊,最后,用VC6.0的基礎(chǔ)類庫MFC(Microsoft Foundation Classes),設(shè)計(jì)基于ffmpeg的H.264解碼播放器,將播放器放在PC機(jī)上,開發(fā)板接上攝像頭,就可以實(shí)現(xiàn)視頻監(jiān)控功能。
下面對本發(fā)明進(jìn)行詳細(xì)描述。
由圖1我們知道我們需要在ARM平臺上進(jìn)行視頻數(shù)據(jù)的H.264壓縮,并進(jìn)行傳輸,由圖2則我們需要在ARM平臺完成以下幾部分工作:a.移植uboot加載程序。b.移植Linux內(nèi)核,構(gòu)建可在ARM平臺上運(yùn)行的嵌入式系統(tǒng)。c.移植文件系統(tǒng),使操作系統(tǒng)可以正常運(yùn)轉(zhuǎn),通常用BusybOX來作為rootfs,yaffs作為nandflash的文件系統(tǒng)。d.編寫用戶應(yīng)用程序,即實(shí)現(xiàn)對視頻的壓縮及壓縮后的數(shù)據(jù)傳輸。則這一部分實(shí)現(xiàn)具體步驟如下:
首先,移植uboot需要完成以下步驟:a.設(shè)置入口指針以及中斷向量表b.屏蔽所有中斷,關(guān)看門狗c.設(shè)置工作時(shí)的CPU和時(shí)鐘頻率d.初始化存儲控制相關(guān)寄存器e.關(guān)閉MMU和Cachef.啟動方式的選擇g.初始化各模式下的棧指針將數(shù)據(jù)段拷貝到RAM中,將零初始化數(shù)據(jù)段清零i.跳轉(zhuǎn)到C語言Main入口函數(shù)中。完成以上幾步以后,則完成了對uboot引導(dǎo)程序的移植,為移植Linux打好了基礎(chǔ)。
然后,移植Linux內(nèi)核需要完成以下步驟:
編輯Makefile文件:進(jìn)入解壓的目錄后,運(yùn)行命令:vi Makefile找到“CROSS-COMPILE=”這行,將它改為CROSS-COMPILE=arm-linux-設(shè)置好后保存退出。
配置內(nèi)核:輸入make menuconfig進(jìn)入內(nèi)核配置界面,選擇我們需要的內(nèi)核功能。本發(fā)明中需要支持USB攝像頭和網(wǎng)卡芯片DM9000,我們將它們的選項(xiàng)改為Y,則內(nèi)核會支持該功能。選擇好后保存并退出配置界面。
編譯內(nèi)核:輸入命令make zImage則將得到linux內(nèi)核壓縮映像zImage,然后將zImage下載并固化在目標(biāo)板的Flash中,實(shí)現(xiàn)內(nèi)核的移植。
其次,移植文件系統(tǒng),我們需要完成以下基本步驟:
準(zhǔn)備根文件系統(tǒng):在機(jī)器上建立rootfs的文件夾mkdir rootfs,在rootfs中建立linux系統(tǒng)中典型的文件夾#cd rootfs:#mkdir root home bin sbin etc dev usr lib tmp mnt sys proc,#mkdir usr/libusr/bin#pwd/home/su/rootfs。
解壓源碼包并修改Makefile:#tar xzvf busybox-1.13.3.tgz#cd busybox-1.13.3,將Makefile中的CROSS COMPILE=改為CROSS COMPILE=arm-1inux-。
定制busybox設(shè)置靜態(tài)編譯方式:選擇busybox下全部的可執(zhí)行程序#make defconfig,然后再Busybox Settings…>Build Options…>Build Busybox as a static binary,Busybox Settings…>Install Options…>中輸入建立根文件系統(tǒng)的文件所在的路徑/home/rootfs,其它的默認(rèn),確保Build Busybox as a static binary(no shared libs)被選中,保存退出。
執(zhí)行make編譯:#make編譯通過,busybox被生成了,然后執(zhí)行#make install。
至此,我們的文件創(chuàng)建移植已經(jīng)完成。
最后,編寫用戶應(yīng)用程序,我們需要完成對H.264的移植需要以下步驟。
交叉編譯x264:
將x264程序拷貝到Linux系統(tǒng),運(yùn)行x264所在目錄下的configure腳本進(jìn)行配置,設(shè)置編碼器和庫文件安裝路徑、目標(biāo)系統(tǒng)類型(Linux或Windows)、指定編譯工具鏈和編譯選項(xiàng)等。輸入CC=arm-linux-./configure會在當(dāng)前目錄生成config.mak文件,然后調(diào)用make開始編譯,緊接著make install安裝二進(jìn)制程序代碼,這里需要管理員root的身份,這樣就能夠得到目標(biāo)平臺處理器格式的二進(jìn)制可執(zhí)行文件x264。
x264參數(shù)配置:
本發(fā)明選擇基本檔次:利用I片和P片支持幀內(nèi)和幀間編碼,支持利用基于上下文的自適應(yīng)的變長編碼進(jìn)行的熵編碼(CAVLC)。主要用于可視電話、會 議電視、無線通信等實(shí)時(shí)視頻通信。
由圖3可知,我們需要在電腦監(jiān)控端最終實(shí)現(xiàn)視頻數(shù)據(jù)的解碼壓縮,則需要以下幾個(gè)過程。
首先,網(wǎng)絡(luò)通信編程:
本發(fā)明程序設(shè)置的打開文件可以是網(wǎng)絡(luò)傳輸?shù)腍264視頻流或者本機(jī)的.H264文件。程序默認(rèn)是打開網(wǎng)絡(luò)傳輸?shù)囊曨l流,這里采用了Winsock進(jìn)行網(wǎng)絡(luò)編程。Windows Soceket API是TCP/IP網(wǎng)絡(luò)環(huán)境里,也是Intetnet上進(jìn)行開發(fā)最為通用的API?;赥CP的編程是采用的流式套接字??蛻舳司幊痰牟襟E:首先加載套接字庫,創(chuàng)建套接字。然后,向服務(wù)器發(fā)出連接請求。其次,和服務(wù)器端進(jìn)行通信。最后關(guān)閉套接字,關(guān)閉加載的套接字庫。
然后,就是如何解碼播放x264文件。本發(fā)明采用的是用SDL作為視頻輸出對象,ffmpeg完成對.H264視頻的解碼。
初始化SDL是通過SDLinit()函數(shù)來實(shí)現(xiàn)的。如果初始化失敗,函數(shù)返回值為0。函數(shù)只接受初始化對象作為參數(shù)。如果要初始化視頻屏幕,傳入常數(shù)SDL_INIT_VIDEO作為參數(shù)。本發(fā)明使用函數(shù)SDL-SetVideoMode(width,height,0,SDL-HWSURFACE I SDL_DOUBLEBUF)來設(shè)置屏幕分辨率。前三個(gè)參數(shù)分別為屏幕寬度,高度和屏幕上的每象素包含的位數(shù)(bits per pixel,BPP)。如果填入0則SDL自動選擇最合適的BPP。第四個(gè)參數(shù)用來給出某些特殊標(biāo)志位。SDL有很多方法實(shí)現(xiàn)視頻的輸出,本發(fā)明采取的是YUVoverlay。其流程是首先創(chuàng)建一個(gè)surface用來顯示視頻數(shù)據(jù),然后創(chuàng)建一個(gè)overlay,這樣就可以通過overlay輸出視頻到surface。
最后,是解碼播放,這里調(diào)用ffmpeg中的decode thread()進(jìn)行解碼。這個(gè)線程從視頻隊(duì)列中讀取包,把它解碼成視頻幀,然后調(diào)用queue picture()函數(shù)把處理好的幀放入到圖片隊(duì)列中。接著就是將解碼后的幀pFrame保存到圖像隊(duì)列中。因?yàn)槲覀兊膱D像隊(duì)列是SDL的覆蓋的集合,我們需要把幀轉(zhuǎn)換成相應(yīng)的格式。
我們需要申請SDL Overlay保存這些緩沖區(qū)。為了使用這個(gè)隊(duì)列,需要兩個(gè)指針:寫入指針和讀取指針。要寫入到隊(duì)列中,我們先要等待緩沖清空以便于有空間來保存VideoPicture。然后程序?qū)z查是否已經(jīng)申請到了一個(gè)可以寫入覆蓋的索引號。如果沒有,就申請一段空間。如果播放窗口的大小已經(jīng)改變,也要重新申請緩沖。
由以上步驟,播放器首先通過網(wǎng)絡(luò)通信,對ffmpeg和SDL進(jìn)行初始化,然后“打開數(shù)據(jù)流″部分負(fù)責(zé)識別文件格式為.H264文件和讀取文件內(nèi)部的壓縮數(shù)據(jù),解碼音頻流、視頻流。最后系統(tǒng)進(jìn)入該循環(huán),等待接收數(shù)據(jù)處理數(shù)據(jù)。最終完成對視頻數(shù)據(jù)的解碼顯示。
綜上所述,本發(fā)明提出了一種基于H264編碼的嵌入式遠(yuǎn)程監(jiān)控系統(tǒng),在視頻傳輸效率提高,同時(shí)降低傳輸視頻數(shù)據(jù)量提高傳輸速度方面完成的很好。由于降低了對整個(gè)系統(tǒng)的要求以及資源的消耗,所以我們可以在成本更低的嵌入式系統(tǒng)上完成視頻采集壓縮過程,從而大大降低了成本。并且由于處理器并未被大量占用,所以我們還可以在同一個(gè)系統(tǒng)上擴(kuò)展其他功能而并不會影響系統(tǒng)響應(yīng)速度,從而為整個(gè)系統(tǒng)向后擴(kuò)展留下了更大的余地,為以后的擴(kuò)展系統(tǒng)功能的設(shè)計(jì)者留下了更大的設(shè)計(jì)空間。