王寶珠,程 杰
(河北工業大學 信息與工程學院,天津 300401)
由于網絡與信息技術的不斷發展,遠程視頻監控技術得到了廣泛的推廣,同時對視頻傳輸的效率、功耗、實時性、分辨率以及傳輸設備的體積大小等方面提出了更高的要求。自從H.264編碼標準發布以來,因其具有優異的壓縮性能、很好的網絡親和性,獲得了極大地支持與應用。但在很多應用場合是通過調用H.264編碼庫,實現了軟件方式的編解碼。本文采用擁有強大的多媒體處理能力ARM11芯片進行開發,它內部集成了專門處理多媒體數據的位處理器,通過ARM內部的MFC模塊完成了對H.264的硬件方式的編解碼。本論文視頻服務器建立在具有豐富的網絡協議、較強的穩定性的Linux系統上,完成了視頻數據的采集、壓縮,然后發送到Boa中,然后通過以太網發送到上位機進行顯示,實現了遠程的實時監控[1]。
本系統主要以友善之臂Tiny6410開發板作為視頻服務器平臺。Tiny6410核心板采用ARM1176JZF-S核設計的CPU,S3C6410內部集成了強大的多媒體處理單元,支持Mpeg4、H.264等格式的硬件編解碼,核心板集成了256M的DDRRAM、1GB Nand Flash存儲器,通過豐富的接口資源與外圍電路相連接。本論文所涉及的主要接口包括標準DB9串口、SD卡接口、JTAG接口、USB串口以及網絡接口。整個硬件系統框圖如圖1所示。

圖1 硬件系統結構圖Fig.1 Structure diagram of hardware system
在該硬件系統中現代的v500攝像頭通過usb接口與開發板相連,向S3C6410提供YUY2格式的視頻幀。目標板通過串口與宿主機連接,通過超級終端與目標板進行通信,對目標板進行控制和文件的傳輸。JTAG接口連接Jlink仿真器,通過宿主機上的rvds軟件進行程序的調試。SD卡用于燒寫superboot,然后完成整個linux系統的移植工作與應用軟件的復制工作。服務器通過DM900網卡與遠程客戶端進行通信。
整個軟件系統包括引導裝入程序、Linux內核、文件系統、各種驅動程序以及應用軟件組成。圖2為視頻服務器的軟件結構框圖。

圖2 軟件系統結構圖Fig.2 Structure diagram of software system
在進行系統移植之前,首先在宿主機上建立開發環境,安裝linux虛擬操作系統,安裝編譯調試軟件RVDS,建立與目標板通信的超級終端,建立交叉編譯環境等相關操作。
本系統首先在SD卡中燒寫superboot,然后將Uboot引導程序移植到Nand Flash中,然后移植版本為Linux 2.6.38的內核,接著移植根文件系統Rootfs,這樣整個操作系統環境就搭建完成了。在編譯Linux內核之前,要配置本系統所需的驅動模塊,將MFC驅動和萬能攝像頭驅動集成到內核中[2]。
V4L2是集成在Linux系統中的一個虛擬的設備驅動。主要功能是使應用程序發現多媒體設備,然后對設備進行操作管理。它提供了各種API接口,在本系統中完成了對攝像頭視頻流的捕獲與輸出,如圖3為數據幀采集流程圖[3]。

圖3 數據采集流程Fig.3 Flow diagram of data capture
1)打開設備文件。 fd=open(Devicename,mode);第一個參數是注冊在/dev/目錄下的設備名,打開模式可分為阻塞和非阻塞模式。
2)獲取設備屬性。通過調用 ioctl(fd,VIDIO_QUERYCAP,&cp)獲取打開設備相關參數存放到cp結構中。
3)設置捕獲格式。 調用 ioctl(fd,VIDIOCS_FMT,&fmt)設置捕獲圖像的存儲格式、寬帶、高度、像素大小等。
4)為視頻幀分配內存。 通過 ioctl(fd,VIDIOC_REQBUFS,&req)向內核申請req.count個緩存。
5)映射緩存。首先通過VIDIOC_QUERBUF獲取緩存地址,然后mmap到用戶空間。
6)視頻幀的采集。調用read()將數據存放到緩存中。
7)處理采集數據。V4L2的數據緩存采用FIFO的方式,當應用程序將最先采到的一幀數據取走時,將重新采集最新的數據。
8)關閉視頻設備。調用close()實現設備的關閉。
本系統通過S3C6410內部多媒體編解碼模塊實現H.264標準的視頻壓縮。采用硬壓縮不占用CPU資源而且速度更快,為視頻的實時傳輸做好了準備[4]。如圖4為MFC編碼流程圖。

圖4 h.264編碼流程圖Fig.4 Flow diagram of h.264 encoder
1)初始化H.264編碼環境。調用SsbSipH264 EncodeInit(Width, Height, Framerate, Bitrate, GOPNum) 來打開 MFC設備并且對編碼結構參數進行初始化。
2)設置編碼參數。調用SsbSip H264 EncodeS et Config(open Handle,type,value)對編碼的各種參數進行配置。
3)獲得視頻輸入地址。通過SsbSipH264EncodeGetInBuf(openHandle,size)獲取視頻輸入地址。
4)通過 memcpy(p_inbuf, in_addr, frame_size)將需要編碼視頻幀復制到編碼時存放原始數據的緩存中。
5)通過 SsbSipH264EncodeExe(handle)函數進行編碼壓縮。
6)關閉設備,調用 SsbSipH264 EncodeDeInit(handle)函數釋放占用資源并且關閉設備。
本系統將boa移植到運行在ARMM11開發板上的Linux系統中,建立了嵌入式web服務器,為遠程客戶端提供基于HTTP協議的網絡接入方式。Boa支持基于CGI的動態網頁,因此采用編寫CGI腳本對遠程客戶端的請求進行響應,發送經過編碼的視頻數據包。如圖5為boa中視頻傳輸的流程圖[5]。

圖5 數據傳輸流程圖Fig.5 Flow diagram of data transmission
1)完成boa服務器的初始化工作。
2)通過socket創建流式套接字,并獲得套接字描述符。
3)通過bind將套接字與服務器地址綁定。
4)通過listen對端口進行監聽。
5)通過accept等待來自客戶端的連接請求。
6)建立相互的連接,分析客戶端命令。
7)執行CGI腳本程序,發送數據。
8)關閉套接字,結束通信。
工作在pc機上的遠程客戶端從網絡接收視頻數據包,然后對視頻幀進行解碼與在屏幕上顯示圖像。本系統采用基于開源的SDL與FFmpeg庫提供的API接口,實現對視頻的解碼與播放[6]。
1)首先進行初始化操作。avcodec_register_all();avdevice_register_all();av_register_all();通過以上函數注冊所有的編解碼器,復用分離器,文件格式的注冊。
2)設置 AVFormatContext結構體,對整個編碼過程所需要的各種參數進行設置。
3)從以上結構體中找到相關解碼器的上下文。
4)調用avcodec_open()函數打開 H.264解碼器。
5)調用avcodec_alloc_frame()函數分配內存來存儲解碼后得到的yuv數據。
6)通過 avcodec_decode_video(p Codec Ctx, Inbuf, &count,outbuf, sizeof(outbuf))函數對數據進行解碼,pCodecCtx 是解碼器的上下文,Inbuf指向解碼后數據的位置,count是已完成的幀數,outbuf指向被解碼解碼的原始數據。最后調用SDL庫中的函數來實現視頻的顯示。
本文完成了遠程視頻監控包括數據采集、數據壓縮、數據傳輸、數據顯示的整個模塊設計。采用了性價比很高的ARM11作為整個服務器的數據處理核心,搭載了開源的具有很好的網絡親和性和穩定性的Linux操作系統,使得應用軟件有一個高效和穩定的運行環境。實現了對視頻數據的H.264標準的硬壓縮,極大提高了數據的處理與傳輸效率,使得整個系統具有較好好的實時性。在該系統的基礎上,可以進行功能的增加和優化,實際應用于各種監控場合。
[1]葉俊華.ARM11的嵌入式視頻處理終端設計[D].長沙:中南大學,2009.
[2]楊牟剛.基于嵌入式Linux的網絡視頻監控系統設計與實現[D].桂林:桂林電子科技大學,2008.
[3]張建江.基于嵌入式Linux的H.264視頻接收系統設計[D].西安:西安電子科技大學,2008.
[4]羅智勇.針對視頻會議應用的H264視頻編碼器研究與實現[D].廣州:暨南大學,2005.
[5]黃恒強.基于ARM和Linux的嵌入式遠程視頻監控系統設計[D].南京:南京理工大學,2008.
[6]胡杰.基于ARM的嵌入式視頻監控終端的研究[D].武漢:武漢理工大學,2008.