李文龍,袁三男
(上海電力大學電子與信息工程學院,上海 201306)
網絡視頻監控設備將嵌入式設備與相應的網絡視頻技術結合,可以提供視頻服務,而且還大大降低了設備的價格[1]。嵌入式操作系統在軟件方面沒有做明顯的區分,如系統軟件和應用軟件。并且在功能設計方面及功能實現上沒有要求過于復雜,這樣做不僅有利于控制系統成本,同時也實現了系統安全[2]。
Linux 系統的主要優點之一為其是一個開放源代碼的操作系統,與Windows 等其他操作系統相比,Linux 更安全。相對于其他操作系統,其主要的優點是可以自定義[3]任何功能,根據需要,添加或刪除任何功能,因為它是開源操作系統[4]。Linux 提供了很高的穩定性,這也是一個很好的優勢,即它不需要在短時間內重啟。
H.264 是ITU-T 的VCEG(視頻編碼專家組)和ISO/IEC 的MPEG(活動圖像編碼專家組)的聯合視頻組(Joint Video Team,JVT)開發的一個數字視頻編碼標準[5]。H.264 是ITU-T 以H.26x 系列為名稱命名的標準之一,AVC 是ISO/IEC MPEG 一方的稱呼[6]。
RTMP(Real Time Messaging Protocol)從屬于應用層,基于TCP 的數據傳輸協議。被用來在TCP 傳輸協議上復用和打包多媒體傳輸流。RTMP 提供了一套全雙工的可靠的多路復用消息服務,用來在一對結點之間并行傳輸帶時間戳的音頻流、視頻流、數據流[7-8]。通過RTMP 協議進行播放需要以下步驟:握手、建立連接、建立流、播放。流程圖如圖1 所示。

圖1 RTMP協議播放流程
系統主要是由服務器端和客戶端組成,服務器端主要完成視頻數據采集,將采集到的原始數據進行壓縮編碼,利用推流器將數據推送到流媒體服務器上。客戶端則采用拉流器從流媒體服務器上進行拉流播放。在該設計中,采用RTMP 協議進行數據傳輸,從而保證視頻數據流能夠實時傳輸。服務器端利用ARM 開發板進行推流,客戶端利用PC 機進行拉流,系統框架圖如圖2 所示。

圖2 系統框架圖
開發板是基于四核ARM Cortex-A7,算力NPU達到2T,并且還支持H.264/H.265 視頻編解碼技術,總容量16 GByte 的8 bitEMMC Flash,USB2.0 外接設備,千兆以太網RTL8211F,MIPI Camera,硬件結構圖如圖3 所示。

圖3 硬件結構圖
交叉編譯工具是在一個平臺上編譯生成可在其他平臺上執行的代碼。同一個體系結構可以運行不同的操作系統[9];同一個操作系統也可以在不同的體系結構上運行。文中上位機的操作系統為ubuntu16.04,該系統安裝交叉編譯工具,用于文件系統和上層應用以及U-Boot 和Linux 內核的編譯。
內核移植是設計系統的核心部分,在設計時采用的是嵌入式系統,嵌入式操作系統有較好的裁剪性,可以根據自己的需求對系統進行裁剪,得到最精簡的系統后將系統寫入存儲芯片中[10]。
嵌入式開發,可以根據具體的應用需求,用不同的配置進行開發,一般的開發過程中都包括如下過程:
1)編譯開機引導裝載程序BootLoader;
2)編譯內核kernel;
3)利用Busybox 或者Buildroot 制作根文件系統;
4)建立應用程序分區;
5)程序的開發;
6)燒錄開機引導裝載程序,內核kernel,根文件系統rootfs,app。
網絡文件系統(NFS)通過掛載的方式,將遠程客戶端的文件掛載到本機上,如同本地文件,也允許遠程客戶端以類似的方式,來通過網絡進行訪問[11]。為了方便后面文件傳輸,利用NFS 建立PC 與開發板之間的聯系,當開發板上電并與電腦通過網線連接后,將設置的共享文件夾掛載到開發板上,在后面的開發中,PC 機與開發板之間便可通過該共享文件夾進行文件傳輸[12]。
開源項目Ngnix 原本是不支持RTMP 協議的,所以需要移植第三方模塊nginx-rtmp-module 來實現RTMP 協議[13]。通過使用Buildroot 工具對Nginx 編譯,在配置編譯前需要先下載第三方模塊,最后編譯生成.img 文件,并將該文件燒錄到開發板。
服務器端完成如下功能:驅動攝像頭采集視頻,壓縮編碼原始數據,對編碼后的視頻數據進行封裝,將封裝后的數據推送到流媒體服務器上,等待客戶端拉流請求[14]。客戶端主要實現從流媒體服務器上進行拉流播放功能。系統流程框圖如圖4 所示。

圖4 系統流程框圖
服務器端主要工作是編寫一個簡單的視頻推流器,將攝像頭采集的視頻數據經過壓縮編碼一系列處理之后,推送到流媒體服務器[15]。攝像頭采集數據利用V4L2 技術,V4L2 是專門為Linux 設備設計的一套視頻框架,視頻設備被當作一個文件[16]。打開設備,用非阻塞模式打開攝像頭設備作為推流器的輸入,將得到的視頻數據采用H.264 標準進行視頻編碼,將編碼后的數據封裝為FLV 格式進行傳輸[17]。流媒體服務器的地址作為輸出。程序流程圖如圖5所示。

圖5 推流器的程序流程圖
客戶端主要編寫從流媒體服務器拉取的視頻數據,并進行解碼實時視頻播放的拉流器應用程序[18]。程序主要是根據流媒體服務器的地址,將視頻數據流拉取下來,拉取下來的視頻數據被封裝成flv 格式,所以不能直接用來播放,需要進一步解封裝,再將解封裝后的數據通過解碼得到原始的視頻流數據,對得到的原始數據進行播放,從而能夠達到實時播放的效果[19]。程序設計流程圖如圖6 所示。

圖6 拉流器程序流程圖
測試首先進入開發板,開啟流媒體服務器并運行推流程序,當服務器程序啟動后,在PC 端打開拉流應用程序,并在應用程序框中輸入流媒體服務器地址,如rtmp://192.168.0.114:1935/live/test,獲取視頻服務,連接成功之后,PC 端顯示器上會顯現出所要監控的畫面,基本達到實時效果并且畫面基本清晰。
視頻監控在市場中具有較為廣泛的應用場景,在日常生活中,視頻監控可以用于安保與預警,保障了人們日常生活安全;在日常出行中,視頻監控可以應用于行車記錄儀以及汽車的全景環視。并且隨著行業的拓展,搭配著其他技術可以應用于特殊的領域,如車牌識別、人臉識別等應用[20]。該文研究了相關的基于嵌入式視頻監控的系統架構,并簡單介紹視頻編解碼的流程,通過編寫視頻推流器和拉流器來實現視頻流數據的實時轉發和接收,為后續的視頻監控開發奠定了基礎。