摘要 在研究嵌入式開發技術的基礎上,提出了一個基于嵌入式處理器S3C2440的實時視頻采集系統解決方案。該方案通過搭建嵌入式Linux開發環境,對T.264編碼器進行優化,并修改移植視頻驅動以及C/S軟件,實現了系統的正常運行。
關鍵詞 S3C2440;Linux;C/S軟件;視頻采集
隨著通信網絡技術的迅速發展,基于網絡的高質量視頻傳輸已逐步取代傳統的文字語音交互模式,成為當今數字通信的主要研究領域之一。而隨著嵌入式操作系統和集成電路設計水平的不斷提高,嵌入式技術與通信網絡以及多媒體技術的融合將成為未來數字視頻通信領域的主流發展趨勢。
一直以來,針對網絡傳輸實時視頻對嵌入式軟硬件都有較高要求。本文利用基于ARM920T內核的S3C2440嵌入式微處理器,采用壓縮比更高的H.264視頻壓縮標準和開源嵌入式Linux系統,設計了一款基于嵌入式視頻服務器的遠程實時視頻采集系統。
1 采集系統平臺搭建
1.1 系統硬件平臺
該采集系統以PC作為客戶端,以廣東友善之臂計算機科技有限公司研發的ARM9開發板Mini2440作為視頻服務器,采用SamsungS3C2440為微處理器,用專業穩定的CPU內核電源芯片和復位芯片保證系統運行時的穩定性。三星公司推出的這款16/32位RISC微處理器S3C2440,采用ARM920T的內核,典型主頻400 MHz,最高可達533 MHz,使用5級流水線技術,并采用豐富的控制模塊為各種應用提供擴展。該采集系統的結構如圖1所示。
1.2 系統軟件平臺搭建
PC機端使用內核版本為2.6.18的Linux 5紅帽子企業版,由于后續需要在Windows平臺進行FTP資料傳輸等工作,所以采取了虛擬機安裝Linux的方式,這樣方便Linux和Windows的數據網絡交互。虛擬機軟件版本為Vmware 6.5.1,采用的傳輸軟件為基于SFTP協議的Flash Fxp。而交叉編譯工具主要為Binutils、Gcc和Glibc。
一個嵌入式系統軟件角度主要分為引導加載程序、Linux內核和文件系統3個層次,其中引導加載程序是系統加電后運行的第一段軟件代碼。BootLoader就是在操作系統內核運行之前運行的一段程序。在負責引導用的Hash存儲器中,通常會按照圖2的順序分布。
因為后期進行攝像頭驅動編寫移植過程需要大量的調試,基于網絡的NFS根文件系統就比較合適。基于這種考慮,選擇了網絡功能強大的U-boot作為BootLoader。移植U-boot主要做了以下工作:(1)修改編譯條件,添加寄存器定義,修改時鐘。(2)修改中斷禁止部分,添加S3C24 40的中斷禁止代碼。(3)在board目錄創建新開發板目錄。(4)以smdk2410.c為模板修改PLL以及UPLL的設置。(5)修改Makefile相應配置行以支持該開發板。
修改完畢后進入工作目錄進行板級配置,通過交叉編譯工具鏈對改后代碼進行編譯。利用H-JTAG軟件進行燒寫,如圖3所示為燒寫成功并通過超級終端引導完成。
根文件系統掛載方式主要有ramdisk,NFS和initramfs這3種。制作自啟動的嵌入式設備需要用initramfs作為根文件系統的內核進行燒寫。先0地址處存放的是U-boot,約為100 kB;然后在0x0000~0x40000存放了約64 kB的環境變量。這兩項均固定,所以uImage的大小必須控制在1.75 MB以下,并從0x40000開始存放。uImage包括內核和根文件系統兩部分,需要針對其進行裁減,以符合項目要求。
在嵌入式系統中,BusyBox是構造文件系統常用的一個軟件工具包。本文采用它來構建根文件系統。本項目使用的目標板內核為Linux 2.6.29,但根據項目自啟動需要進行相應裁剪,根據最小系統標準進行裁減,串口、網口、根文件系統可用,并保留本文所要求的攝像頭驅動,裁剪后的內核大小為1.3 MB,滿足系統需要,如圖4所示。
2 視頻驅動編寫以及C/S軟件設計
2.1 T.264編碼庫優化移植
T.264為中國視頻編碼自由組織聯合開發的開源編碼器,它對H.264的特性支持單一,編碼器可輸出標準264碼流,解碼器能解T.264編碼器生成的碼流,它吸收了JM、X264和XVID的優點,適用于網絡流媒體的傳輸。由于本文研究的視頻采集系統應用于可視電話視頻會議等應用中,對網絡傳輸的要求較高,綜合比較后,選用T.264作為本系統的軟件編碼器。
采用H.264中的基本檔次,僅使用CAVLC熵編碼方式即可滿足應用要求。綜合不同平均碼率下的編碼性能以及網絡傳輸能力的考慮,對于QCIF格式運動平緩的視頻序列,編碼輸出幀率為15 f·s-1時,設置平均碼率為128 kb·s-1是比較合適的選擇。使用T.264開源編碼器,并對T.264進行代碼級優化編譯。在編譯級添加了如下選項:(1)-fomit-frame-pointer選項忽略函數中不必要的幀指針,節省指令開銷。(2)-04幾乎打開了所有的優化選項,以盡可能提高程序運行效率。(3)-msoft-float:產生基于浮點運算函數庫調用的軟浮點目標代碼。
2.2 視頻驅動編寫以及C/S軟件設計
采用目前國內市場占有率較大的臺灣松翰SONIX613a主控芯片的攝像頭,該攝像頭支持Jpeg格式和4:2:0采樣的YUV原始視頻數據輸出,數據量小,可直接作為H.264等視頻壓縮編碼標準的原始視頻數據源,避免了對圖像的重采樣和色彩空間的變換等復雜的數字運算處理,適合嵌入式的實時視頻采集應用。
2.2.1 驅動程序Gspca的修改移植
Gspca/Spca5xx是自由軟件基金會發布的通用USB攝像頭驅動程序。但由于該解決方案在Linux內核中并無驅動支持,所以必須針對其進行驅動的添加和修改,如圖5所示。
2.2.2 C/S軟件設計
出于對特定的應用對象以及成本的考慮,本文采用基于有線以太網絡流媒體傳輸H.264視頻的解決方案。采用開源軟件VLC作為流媒體服務器與客戶端播放器,進行單向點對點實時視頻通信。圖6為視頻采集系統工作流程圖。
(1)服務器端軟件設計。
視頻采集系統的服務器端采用后臺控制程序video_server受理客戶端video_client對VLC視頻服務器的遠程管理與設置,通過同一端口(3490)和同一套消息碼進行通信。并在系統初始化腳本/etc/init.d/rcS中激活網卡后添加后臺運行服務器控制程序Video Server的命令,使開發板啟動后在后臺自動運行video_server,它首先創建服務器端的套接口描述符,并與服務器端口地址及與client端統一的通信端口綁定,接著進入服務響應的主循環體,偵聽套接口數據及連接,根據來自客戶端的消息請求提供不同服務。video_server軟件流程如圖7所示。
(2)客戶端軟件設計。
客戶機端程序Video Client的運行于PC機平臺,用來向Server端發送遠程控制命令。通過遠程控制命令,可以配置服務器端的視頻格式碼率和傳輸協議、啟停服務器端VLC進程、調本地VLC播放器接收并播放來自服務器端的視頻圖像等。
針對此程序利用跨平臺界面庫QT設計了GUI操作界面,有助于用戶的交互。
由于服務器端對CIF格式圖像采集及壓縮編碼速度較慢,因此程序僅支持這兩個檔次QCIF64 kb·s-1、QCIF-128 kb·s-1。設置完畢,點Connect按鈕,Client向Server發送附帶服務器設置參數的連接請求,若從Server接收到OK消息,表明server端接受了本地的連接請求并啟動了Server端的VLC服務器,這時客戶端將Connect按鈕置為Disconnect按鈕,同叫調用本地VLC播放器,接收并播放服務器發送的視頻數據:若從服務器接收到NOK消息,則出錯。服務器在正常接收和播放服務器發送的視頻數據時,若點Disconnect按鈕,則向Server發送SRV_QUIT請求,同時關閉本地的VLC播放器,Server接收到SRV_QUIT消息后,關閉Server端的VLC服務器。
整個系統PC機是客戶端,基于S3C2440處理器的Mini2440開發平臺是嵌入式視頻服務器,Client程序通過以太網連接服務器,服務器響應請求后啟動VLC進行視頻采集并將視頻數據傳輸到客戶端,而后Client程序調用VLC播放器窗口對接收到的碼流進行實時播放,正常工作情況如圖8所示。
從視頻圖像幀率上看,經過優化的T.264編碼器對QCIF視頻平均碼率在128 kbit·s-1時,編碼速度能夠達到16 f·s-1,但由于USB攝像頭采集QCIF格式圖像在約13 f·s-1,因此需要在服務器端設置壓縮幀率為13 f·s-1,這樣可以保證客戶端以原有幀率解碼視頻流,從系統的整體性能考慮,這個碼率能夠滿足遠程教育和視頻監控等應用。
3 結束語
研究了嵌入式Linux的開發技術,建立起基于Mini2440開發板的Linux開發平臺,包括搭建交叉編譯環境,設計裁減移植BootLoader和Linux2.6.29內核,構建基于BusyBox的根文件系統,開發針對視頻采集系統的專用攝像頭驅動。研究了H.264視頻壓縮編碼標準,針對該視頻采集系統對開源的T.264編碼器進行編譯和代碼級優化,達到實時應用要求。研究了基于UDP協議的網絡傳輸方案,修改設計服務器端的采集程序和客戶端的視頻解碼播放程序,最終實現嵌入式視頻采集系統的運行。