蘆照,謝鑫剛,龍順宇,楊 偉
(海南熱帶海洋學(xué)院 海洋信息工程學(xué)院,海南 三亞 572022)
隨著嵌入式技術(shù)的發(fā)展,它逐漸被應(yīng)用到更多領(lǐng)域,同時(shí)也融入傳統(tǒng)海洋漁業(yè)助力其向智慧海洋牧場轉(zhuǎn)型[1-3]。開展?jié)O業(yè)資源的勘探以及海域環(huán)境的檢測,可以為海洋牧場合理的功能分區(qū)提供有效依據(jù)[4]。海洋牧場的后期維護(hù)和管理,對其持續(xù)良好運(yùn)作有著重要作用[5]。解決海洋牧場現(xiàn)存“看不見”的問題,能及時(shí)了解海洋牧場海洋環(huán)境,摸清海洋資源變動(dòng)趨勢,對海洋牧場生態(tài)情況進(jìn)行預(yù)報(bào)預(yù)警,進(jìn)而指導(dǎo)海洋牧場建設(shè)[6]。對海洋牧場內(nèi)海洋環(huán)境的動(dòng)態(tài)監(jiān)測,有利于實(shí)現(xiàn)海洋生物的可持續(xù)、可再生利用[7]。
根據(jù)海洋牧場需求現(xiàn)狀,本文提出了一種海洋牧場視覺系統(tǒng),系統(tǒng)基于嵌入式Linux平臺(tái)利用USB攝像頭采集視頻圖像,視頻數(shù)據(jù)通過ffmpeg推流到Nginx服務(wù)器,地面站拉流顯示海洋牧場視頻圖像。用千兆網(wǎng)橋傳輸視頻數(shù)據(jù),保證了數(shù)據(jù)傳輸?shù)姆€(wěn)定快速、低時(shí)延以及整個(gè)海洋牧場的可視化。
海洋牧場視覺系統(tǒng)由三部分組成,分別為視頻圖像采集端、地面站、水上視覺云臺(tái)。視頻圖像采集端由USB攝像頭和嵌入式處理器構(gòu)成,通過網(wǎng)橋連接廣域網(wǎng),視頻傳輸數(shù)據(jù)經(jīng)ffmpeg軟編碼后通過RTMP協(xié)議推流到Nginx服務(wù)器來實(shí)現(xiàn)。地面站部分主要是在地面站上實(shí)現(xiàn)視頻圖像的觀看、保存和處理等,配置Nginx服務(wù)器上應(yīng)用程序?qū)崿F(xiàn)。水上視覺云臺(tái)搭載交換機(jī)將不同視頻采集節(jié)點(diǎn)接入網(wǎng)絡(luò),并通過蓄電池給視頻采集端供電。視覺系統(tǒng)結(jié)構(gòu)如圖1所示。
圖1 海洋牧場視覺系統(tǒng)框圖
V4L2框架方便用戶的開發(fā)和接口的統(tǒng)一,用戶只需調(diào)用這些接口開發(fā)一個(gè)公共的服務(wù)層,就可以讓所有的多媒體框架共用同一套驅(qū)動(dòng)程序,有效地節(jié)省了開發(fā)時(shí)間,提高了工作效率[8]。V4L2框架如圖2所示。
圖2 V4L2框架
FLV容器格式具有封裝播放簡易、視頻文件體積小巧等特點(diǎn),適合用于在網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)傳輸,是流媒體數(shù)據(jù)傳輸封裝格式的較好選擇[9]。而HTTPFLV協(xié)議是將RTMP等負(fù)載數(shù)據(jù)信息搭載在HTTP協(xié)議上的碼流傳遞協(xié)議,穿透防火墻能力較強(qiáng)。
ffmpeg是一個(gè)免費(fèi)的多媒體框架,提供了錄制、轉(zhuǎn)換以及流化視頻的完整解決方案,包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec,視頻采集節(jié)點(diǎn)嵌入式平臺(tái)上運(yùn)行ffmpeg進(jìn)行推流。ffmpeg推流流程如圖3所示。
圖3 あmpeg推流流程
將攝像頭采集的JPEG格式圖片數(shù)據(jù)經(jīng)ffmpeg編碼成H.264格式,經(jīng)過復(fù)用容器格式變?yōu)镕LV之后,通過HTTPFLV協(xié)議推流到Nginx流媒體服務(wù)器。
視頻推流命令為:ffmpeg -f v4l2 -i /dev/video0 -vcodec libx264 -fflv rtmp://127.0.0.1/live/lu。
Nginx是一款輕量級的Web服務(wù)器、反向代理服務(wù)器及電子郵件代理服務(wù)器,并在一個(gè)BSD-like協(xié)議下發(fā)行。其特點(diǎn)是占有內(nèi)存少、并發(fā)能力強(qiáng)[10]。
使用Buildroot,配置選擇Nginx,直接編譯生成映像文件。設(shè)置交叉編譯工具鏈,下載第三方模塊后在Buildroot目錄選中Nginx并設(shè)置額外的參數(shù),在“additional modules”中添加:$(TOPDIR)/dl/nginx/nginx-http-flv-module,最后執(zhí)行make。Buildroot的dl/nginx目錄下自動(dòng)下載源碼,并將編譯結(jié)果保存在output/images目錄下,最后燒寫該目錄下的boot.scr.uimg鏡像文件到嵌入式平臺(tái)的EMMC中。
配置/etc/nginx/nginx.conf 使數(shù)據(jù)圖像保存在Nginx服務(wù)器,通過user root賦予服務(wù)器Nginx處理文件權(quán)限,并配置out_queue、out_cork、max_streams和timeout等圖像存儲(chǔ)數(shù)據(jù)區(qū)參數(shù)。在server類中的APP代碼如下:
ffmpeg將數(shù)據(jù)流推送到Nginx流媒體服務(wù)器,單個(gè)視頻采集點(diǎn)的海洋牧場實(shí)時(shí)圖像存儲(chǔ)在對應(yīng)的視頻保存路徑。
lf v.js是HTML5 FLASH視頻(FLV)播放器,使瀏覽器在不借助FLASH情況下播放FLV。 flv.js經(jīng)過實(shí)際優(yōu)化配置代碼如下:
配置完成后,打開測試HTML文件,使能ffmpeg推流,Web端顯示圖像。
將實(shí)測攝像頭數(shù)據(jù)編碼復(fù)用之后推流到服務(wù)器的命令如下:
ffmpeg -f v4l2 -framerate 10 -i /dev/video0 -vcodec libx264-preset:v ultrafast -tune:v zerolatency -fflv rtmp://127.0.0.1/live/lu
打開配置好的Web端從服務(wù)器通過HTTPFLV協(xié)議拉流或運(yùn)行播放器通過RTMP協(xié)議拉取網(wǎng)絡(luò)串流,顯示圖像。
淺水層中,多個(gè)視頻采集節(jié)點(diǎn)從不同角度顯示人工珊瑚圖像,最終顯示效果如圖4所示。
圖4 顯示效果
在嵌入式平臺(tái)上使用ffmpeg、nginx-http- flv-module模塊和 flv.js實(shí)現(xiàn)了無插件Web端和播放器拉取視頻流播放海洋牧場視頻采集節(jié)點(diǎn)監(jiān)控視頻,但是Web端視頻暫停后點(diǎn)擊繼續(xù)播放會(huì)出現(xiàn)從暫停時(shí)的場景繼續(xù)播放的情況;對于顯示視頻圖像會(huì)產(chǎn)生延遲的問題,應(yīng)采用軟件斷流重連等算法進(jìn)行進(jìn)一步優(yōu)化。視覺云上平臺(tái)留有接口,方便該視覺系統(tǒng)擴(kuò)展視頻采集結(jié)點(diǎn)及其他功能。該視覺系統(tǒng)對海洋牧場的維護(hù)及管理有一定的積極作用。