吳丹陽(yáng),魏元焜
(遼寧機(jī)電職業(yè)技術(shù)學(xué)院,遼寧丹東,118009)
網(wǎng)絡(luò)視頻系統(tǒng)通常指的是安全監(jiān)視和遠(yuǎn)程監(jiān)控領(lǐng)域內(nèi)用于特定應(yīng)用的IP 監(jiān)視系統(tǒng)[1],該系統(tǒng)使用戶能夠通過IP 網(wǎng)絡(luò)實(shí)現(xiàn)視頻監(jiān)控及視頻圖像的錄像,以及相關(guān)的報(bào)警管理[2]。與模擬視頻系統(tǒng)不同的是,網(wǎng)絡(luò)視頻系統(tǒng)采用網(wǎng)絡(luò),而不是點(diǎn)對(duì)點(diǎn)的模擬視頻電纜,來傳輸視頻及其他與監(jiān)控相關(guān)的各類信息[3]。網(wǎng)絡(luò)視頻系統(tǒng)在安防、醫(yī)療等多個(gè)領(lǐng)域具有廣泛的應(yīng)用。隨著技術(shù)的發(fā)展,實(shí)現(xiàn)網(wǎng)絡(luò)視頻系統(tǒng)的技術(shù)手段也在不斷革新,一些新的實(shí)現(xiàn)方法也在不斷涌現(xiàn),這些方法在各自的應(yīng)用場(chǎng)景下也有優(yōu)勢(shì)[4~7]。利用新技術(shù)不斷提升網(wǎng)絡(luò)視頻系統(tǒng)性能的研究是開放性的。
虛擬儀器是基于計(jì)算機(jī)的儀器,計(jì)算機(jī)和儀器的密切結(jié)合是目前儀器發(fā)展的一個(gè)重要方向[8]。它盡可能采用了通用的硬件,各種儀器的差異主要是軟件。因而可充分發(fā)揮計(jì)算機(jī)的能力,有強(qiáng)大的數(shù)據(jù)處理功能,可以創(chuàng)造出功能更強(qiáng)的儀器。用戶可以根據(jù)自己的需要定義和制造各種儀器[9]。
因此,本文提出了一種新的、基于虛擬儀器的網(wǎng)絡(luò)視頻系統(tǒng)設(shè)計(jì)思路,給出了具體的設(shè)計(jì)方法和關(guān)鍵步驟,并通過實(shí)驗(yàn)驗(yàn)證了系統(tǒng)功能。
如圖1 所示,系統(tǒng)分為視頻采集端和視頻播放端,兩個(gè)模塊之間通過WLAN 以rtsp 協(xié)議傳輸視頻數(shù)據(jù),因此兩個(gè)模塊分別作為rtsp 的服務(wù)器和客戶端存在[10]。視頻采集端負(fù)責(zé)視頻的實(shí)時(shí)采集,底層硬件為視頻采集板卡,搭載海思的專業(yè)型智能網(wǎng)絡(luò)攝像機(jī)SoC——Hi3516DV300,對(duì)攝像頭采集到的視頻進(jìn)行編碼和傳輸。為實(shí)現(xiàn)編碼和傳輸功能,板卡運(yùn)行嵌入式Linux 操作系統(tǒng),支持多任務(wù)處理。以海思媒體處理軟件平臺(tái)(Media Process Platform,簡(jiǎn)稱MPP)實(shí)現(xiàn)視頻資源的編解碼等底層處理,由應(yīng)用程序啟動(dòng)rtsp 服務(wù),通過網(wǎng)絡(luò)對(duì)外傳輸視頻信號(hào)。網(wǎng)絡(luò)傳輸可采用有線和無線方式,將視頻信號(hào)傳輸給視頻顯示端。
圖1 系統(tǒng)框圖
顯示端硬件為運(yùn)行Windows 操作系統(tǒng)的PC。以LabVIEW 虛擬儀器開發(fā)平臺(tái)實(shí)現(xiàn)rtsp 的客戶端,并實(shí)現(xiàn)GUI?;谔摂M儀器的設(shè)計(jì)思路,視頻采集端可作為儀器設(shè)備,以LabVIEW 設(shè)計(jì)儀器面板和儀器的核心邏輯。根據(jù)設(shè)計(jì)需要,可方便地更改儀器面板、增加和刪減功能,提高設(shè)備的靈活性。
為在圖1 所示系統(tǒng)上實(shí)現(xiàn)產(chǎn)品開發(fā),首先要構(gòu)建開發(fā)環(huán)境。由于本文給出的方案以嵌入式Linux 為軟件基礎(chǔ),因此需要先構(gòu)建通用的嵌入式Linux 開發(fā)環(huán)境,然后再利用海思提供的軟件開發(fā)工具包構(gòu)建專用開發(fā)環(huán)境。
完整的嵌入式Linux 開發(fā)系統(tǒng)同時(shí)需要硬件和軟件的支持。硬件部分分為目標(biāo)機(jī)、宿主機(jī)和控制平臺(tái)三個(gè)部分,三者目前較為廣泛采用的連接方式為局域網(wǎng)連接。目標(biāo)機(jī)即網(wǎng)絡(luò)攝像機(jī)本身,由于自身資源有限,只能支持功能實(shí)現(xiàn),無法滿足開發(fā)要求,因此目標(biāo)機(jī)中的軟件開發(fā)工作需要依賴于宿主機(jī)。宿主機(jī)本質(zhì)上是一個(gè)運(yùn)行Linux 的服務(wù)器PC,可以是一個(gè)實(shí)際的PC,也可以是一個(gè)虛擬機(jī)。其作用是為編寫、編譯目標(biāo)機(jī)上的程序并最終生成鏡像文件。因此,宿主機(jī)和目標(biāo)機(jī)之間主要進(jìn)行的是文件傳輸。目標(biāo)機(jī)本身不支持圖形界面,Linux 服務(wù)器也不便于日常工作,因此常見的做法是引入一個(gè)基于Windows 的控制平臺(tái),用于登錄和管理目標(biāo)機(jī)和宿主機(jī)之間的文件傳輸。而宿主機(jī)也可以是控制平臺(tái)中運(yùn)行的虛擬機(jī)[12]。
目標(biāo)機(jī)是一個(gè)完整的嵌入式Linux 操作系統(tǒng),在軟件角度看,需要具有完整的硬件初始化、系統(tǒng)引導(dǎo)、操作系統(tǒng)、文件系統(tǒng)等部件,因此主要有:Bootloader、Linux內(nèi)核、設(shè)備驅(qū)動(dòng)、文件系統(tǒng),以及應(yīng)用程序構(gòu)成。其中Bootloader負(fù)責(zé)底層硬件的初始化和引導(dǎo)操作系統(tǒng)的載入,Linux 內(nèi)核從Bootloader 接管控制權(quán)后,會(huì)進(jìn)一步完成系統(tǒng)初始化、啟動(dòng)各類進(jìn)程、加載設(shè)備驅(qū)動(dòng)等操作,最終實(shí)現(xiàn)任務(wù)調(diào)度、內(nèi)存管理等核心控制功能。文件系統(tǒng)中包含系統(tǒng)運(yùn)行所必需的文件、應(yīng)用程序等。Bootloader、Linux 內(nèi)核、設(shè)備驅(qū)動(dòng)和文件系統(tǒng),都需要根據(jù)具體的設(shè)備來進(jìn)行移植,應(yīng)用程序需要基于軟件開發(fā)平臺(tái)設(shè)計(jì)。這些工作均可利用海思提供的軟件開發(fā)工具包完成[13]。
對(duì)于本文選用的Hi3516DV500 型號(hào)芯片,應(yīng)選用海思的arm-himix200-linux 交叉編譯工具。
交叉編譯工具是指在宿主機(jī)上編譯目標(biāo)機(jī)可執(zhí)行文件或鏡像文件的工具,海思提供了對(duì)應(yīng)的交叉編譯工具。
在root 或sudu 權(quán)限下,以tar –xzf arm-himix200-linux.tgz 命令解壓安裝包,以chmod +x arm-himix200-linux.install 賦予安裝腳本可執(zhí)行權(quán)限,然后執(zhí)行./armhimix200-linux.install 即可執(zhí)行安裝。完成安裝后,通過執(zhí)行source /etc/profile 命令即可生效環(huán)境變量。
完成上述工作后,即可進(jìn)行SDK 的編譯。海思的SDK包含了設(shè)備驅(qū)動(dòng)、文件系統(tǒng)制作工具、ISP、MPP 等組件,可支持海思芯片的全開發(fā)流程。可支持整個(gè)工具包和不同級(jí)別下的自動(dòng)化編譯。
其主要目錄介紹如下:
drv/extdrv/:板級(jí)外圍驅(qū)動(dòng)源代碼
drv/interdrv:mipi,cipher 等驅(qū)動(dòng)源碼
osal/:操作系統(tǒng)適配層代碼
osdrv/:操作系統(tǒng)及相關(guān)驅(qū)動(dòng)
osdrv/opensource:存放Linux 內(nèi)核源碼、u-boot源碼、busybox 源碼
為減小SDK 包大小,部分工具需要自行下載到SDK 的指定目錄,如:
下載4.9.37 版本的Linux 內(nèi)核源碼包,linux-4.9.37.tar.gz 存放到osdrv/opensource/kernel 目錄中。
下載yaffs2utils-0.2.9.tar.gz 存放到osdrv/tools/pc/mkyaffs2image/目錄中。
下載gdb-7.9.1.tar.gz 存放到 osdrv/tools/board/gdb/目錄中。
下載ncurses-6.0.tar.gz 存放到osdrv/tools/board/gdb/目錄中。
下載util-linux-2.31.tar.gz 存放到osdrv/tools/pc/cramfs_tool/目錄中。
此外,本文使用Ubuntu16.04 作為宿主機(jī)的操作系統(tǒng),需要安裝部分依賴。在sudo 環(huán)境下,直接接用aptget install 來安裝即可:zlib1g-dev、liblzo2-dev、uuiddev、pkg-config、libuuid1、bison、mtd-utils、u-boottools、libncurses5-dev、libcrypto++-dev、binutils、uuid、uuid-dev、gperf、make、gcc、g++。
完成上述工作后,即可在osdrv 目錄下執(zhí)行./make BOOT_MEDIA=emmc all,對(duì)SDK 進(jìn)行指定啟動(dòng)媒介的整體編譯。由于本文采用的目標(biāo)機(jī)啟動(dòng)媒介是emmc 存儲(chǔ)設(shè)備,因此在make all 時(shí)添加了BOOT_MEDIA=emmc 配置項(xiàng)。
在osdrv/pub/bin 下,會(huì)編譯出目標(biāo)機(jī)和宿主機(jī)上的工具,包括鏡像制作工具、GDB 調(diào)試工具等,在hi3516dv300_emmc_image_glibc 下,是編譯出的uboot、uImage 和rootfs 的鏡像包.osdrv/pub/下的rootfs_glibc.tar 是我們編譯出rootfs 鏡像的模板。
在osdrv/pub/bin/board_glibc 下是編譯出的板端使用的工具。
在smp/a7_linux/mpp 下,是編譯出的ko 配置驅(qū)動(dòng),sample 測(cè)試固件程序。
在osdrv/opensource/busybox/busybox-1.26.2/_install 下,是bin sbin usr 文件。
osdrv/tools/pc/jffs2_tool/tmp/sbin 下,配置工具里面所有命令都是指向busybox 的連接。
本系統(tǒng)以視頻采集板卡+OV5647 攝像頭構(gòu)建視頻采集端。板卡以海思智能網(wǎng)絡(luò)攝像機(jī)專用SoC(hi3516dv300)為控制核心,對(duì)外提供以太網(wǎng)、MIPI、HDMI 等多種接口方便數(shù)據(jù)的本地和遠(yuǎn)程傳輸。
海思官方為SoC 提供了便捷的SDK,用戶通過對(duì)裁剪好的嵌入式Linux 操作系統(tǒng)和文件系統(tǒng)進(jìn)行適當(dāng)配置,即可編譯生成系統(tǒng)鏡像和文件系統(tǒng)鏡像,快速搭建嵌入式軟件系統(tǒng)。在Linux 系統(tǒng)基礎(chǔ)上,音視頻處理功能通過海思提供的MPP 軟件平臺(tái)實(shí)現(xiàn)。該軟件平臺(tái)為應(yīng)用軟件屏蔽了芯片相關(guān)的復(fù)雜底層操作,并直接提供MPI(MPP Program Interface)接口完成相應(yīng)功能,可支持應(yīng)用軟件快速開發(fā),集成了輸入視頻捕獲、H.265/H.264/JPEG 編碼、H.265/264/JPEG 解碼、視頻輸出顯示、視頻圖像前處理(包括去噪增強(qiáng)銳化)示、視頻圖像前處理(包括去噪增強(qiáng)銳化)圖像拼接、圖像幾何矯正、智能音頻等功能。
視頻采集端系統(tǒng)層次如圖2 所示。硬件層包括視頻采集板卡和OV5647攝像頭,在板卡上運(yùn)行的是嵌入式Linux 操作系統(tǒng),以滿足多任務(wù)處理的要求。操作系統(tǒng)適配層用于屏蔽不同操作系統(tǒng)(如Linux 和鴻蒙等)的差異,為MPP層提供統(tǒng)一的接口。以MPP 為基礎(chǔ),應(yīng)用層可以實(shí)現(xiàn)直接面向用戶的功能。
圖2 視頻采集端系統(tǒng)層次
圖3 給出了MPP 建立視頻流的過程,涉及MPP 中的幾個(gè)關(guān)鍵模塊:視頻輸入(Video Input,VI)、視頻解碼(Video Decode,VDEC)、視頻處理子系統(tǒng)(Video Process Sub System,VPSS)、視頻編碼(Video Encode,VENC)以及視頻輸出(Video Output,VO)??赏ㄟ^綁定在相關(guān)模塊間建立數(shù)據(jù)傳輸通道。
圖3 MPP 視頻數(shù)據(jù)流
VI 模塊接收攝像頭經(jīng)MIPI 接口傳輸來的視頻數(shù)據(jù),將其存入指定的內(nèi)存區(qū)域,這一過程中,VI 模塊可對(duì)接收到的原始視頻圖像數(shù)據(jù)進(jìn)行處理。VDEC 模塊從存儲(chǔ)卡中讀取保存好的視頻圖像數(shù)據(jù),對(duì)其進(jìn)行解碼,存入計(jì)算機(jī)。VI 或VDEC 處理后的原始視頻圖像數(shù)據(jù)向后繼續(xù)傳輸,在VPSS 中,控制幀率、對(duì)圖像進(jìn)行縮放、旋轉(zhuǎn)、銳化、去噪、遮蓋、添加馬賽克等操作。VO 模塊主動(dòng)從內(nèi)存相應(yīng)位置讀取視頻和圖形數(shù)據(jù),并通過相應(yīng)的顯示設(shè)備輸出視頻和圖形。VENC 模塊對(duì)處理后的圖像進(jìn)行編碼操作,可產(chǎn)生多種不同的碼流,且VENC 支持多路實(shí)時(shí)編碼,且每路編碼相互獨(dú)立。
建立rtsp 服務(wù)的操作對(duì)應(yīng)視頻采集端系統(tǒng)層次中的應(yīng)用層。它從MPP 平臺(tái)讀到視頻碼流,將其以rtsp 協(xié)議傳輸,具體流程如圖4 所示。
圖4 rtsp 傳輸流程
首先啟動(dòng)rtsp 服務(wù),然后對(duì)MPP 平臺(tái)的各個(gè)相關(guān)模塊進(jìn)行初始化、啟動(dòng)和綁定操作,以建立數(shù)據(jù)流通路,最后以異步線程的形式開始獲取視頻碼流。在碼流獲取線程中,不斷等待VENC 空閑,通過調(diào)用MPP 接口HI_MPI_VENC_GetStream 將獲取到的視頻碼流進(jìn)行數(shù)據(jù)解析,保存到開辟的內(nèi)存空間中,進(jìn)而以rtsp 協(xié)議發(fā)送,最終釋放內(nèi)存,完成一幀數(shù)據(jù)的接收和發(fā)送,循環(huán)往復(fù)。
本文以LabVIEW 平臺(tái)實(shí)現(xiàn)視頻現(xiàn)時(shí)段的界面和控制邏輯設(shè)計(jì)??刂七壿嬛饕糜诮邮沼脩糁噶睢?dòng)rtsp 客戶端服務(wù),讀取服務(wù)器端發(fā)送來的視頻數(shù)據(jù)并予以實(shí)時(shí)顯示。rtsp 視頻流通過VLC 媒體播放器的ActiveX 播放,通過調(diào)用VLC 的動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)。為實(shí)現(xiàn)多路視頻流的動(dòng)態(tài)加載、刪除和切換等功能,還需配合LabVIEW 的消息隊(duì)列處理器框架(即軟件設(shè)計(jì)模式)。
首先要保證安裝有VLC 播放器,然后進(jìn)行VLC ActiveX 的安裝注冊(cè)。將VLC 播放器安裝目錄下的npvlc.dll、libvlccore.dll、libvlc.dll、axvlc.dll、plugins 和lua文件夾復(fù)制到 C:WINDOWSsystem32 目錄下。運(yùn)行regsvr32 axvlc.dll 指令,若提 示axvlc.dll 中DLLRegisterServer 成功,則表明ActiveX 控件注冊(cè)成功。
在程序的實(shí)現(xiàn)上,需要使用兩個(gè)關(guān)鍵類:IVLCControl2 和IVLCPlaylist。前 者作為參數(shù)傳輸給后者,以便視頻流在指定控件上的顯示。IVLCPlaylist 是控制播放列表動(dòng)作的類,在程序中,通過調(diào)用關(guān)鍵方法,如add(添加到列表)、next(下一個(gè)條目)、play(播放)、pause(暫停)、stop(停止),即可控制視頻流的播放,并可控制在來自多個(gè)采集終端的視頻流的切換。圖5 給出了利用這兩個(gè)類實(shí)現(xiàn)簡(jiǎn)單rtsp 流播放的程序示例。建立與視頻采集端的連接后,視頻播放結(jié)果如圖6 所示。
圖6 LabVIEW 播放rtsp 視頻流效果
消息隊(duì)列處理器框架是編寫大型LabVIEW 虛擬儀器的典型方法[11]。這一設(shè)計(jì)模式將每一個(gè)相對(duì)獨(dú)立功能的代碼片段模塊化,把每一個(gè)模塊視為儀器運(yùn)行的一個(gè)狀態(tài)。每一個(gè)狀態(tài)由之前的狀態(tài)指定,狀態(tài)自身也可以指定下一個(gè)(或連續(xù)的多個(gè))狀態(tài)。由于多個(gè)狀態(tài)需要以隊(duì)列的數(shù)據(jù)結(jié)構(gòu)通過消息存儲(chǔ)和分發(fā),因此稱為消息隊(duì)列處理器。這一設(shè)計(jì)方法可以將復(fù)雜的LabVIEW 程序框圖標(biāo)簽化,既控制了LabVIEW 程序框圖的規(guī)模,又便于程序后期的維護(hù)。本文3.1 節(jié)中給出的功能相對(duì)簡(jiǎn)單,圖5 給出的程序框圖僅僅是一個(gè)實(shí)現(xiàn)功能的示例,這種最基本的事件結(jié)構(gòu)設(shè)計(jì)框架難以支撐復(fù)雜功能的實(shí)現(xiàn)。而利用本節(jié)所述的消息隊(duì)列處理器設(shè)計(jì)框架,可以實(shí)現(xiàn)更復(fù)雜的功能,如多通道rtsp 視頻流的控制操作。
圖7 給出了以消息隊(duì)列處理器設(shè)計(jì)多通道rtsp 視頻流控制的狀態(tài)遷移圖,在消息隊(duì)列處理器框架下可以用極小的代碼修改實(shí)現(xiàn)狀態(tài)添加、刪除或修改狀態(tài)遷移關(guān)系。這一設(shè)計(jì)方法也表明,利用虛擬儀器的軟硬分離特性,本系統(tǒng)可根據(jù)用戶的需求,在產(chǎn)品使用期間,及時(shí)進(jìn)行產(chǎn)品升級(jí),而不影響硬件設(shè)備本身。
圖7 實(shí)現(xiàn)擴(kuò)展功能的狀態(tài)遷移圖
網(wǎng)絡(luò)視頻傳輸系統(tǒng)廣泛用于安防、醫(yī)療、教學(xué)等領(lǐng)域,實(shí)現(xiàn)方案眾多。本文給出的方案簡(jiǎn)單易行,硬件核心采用國(guó)產(chǎn)高性能芯片,避免了國(guó)外的技術(shù)壟斷,盡量采用開源解決方案完成系統(tǒng)設(shè)計(jì),最大程度保證系統(tǒng)的安全性。通過融合虛擬儀器技術(shù),極大提高了系統(tǒng)的靈活性,方便系統(tǒng)的升級(jí)擴(kuò)展。