劉中柱,楊福合
(中北大學(xué) 軍民融合協(xié)同創(chuàng)新研究院,山西 太原 030051)
某車載裝備上安裝有四路視頻設(shè)備,分別是一個(gè)可見光相機(jī)、一個(gè)紅外相機(jī)和兩個(gè)監(jiān)控?cái)z像頭,四路視頻的分辨率大小和視頻壓縮率均不盡相同。在設(shè)備調(diào)試階段,需要在遠(yuǎn)程同時(shí)監(jiān)控這四路視頻,且在需要時(shí)能同步保存這四路視頻,并能在后期同步回放所記錄的四路視頻。此外,在作戰(zhàn)時(shí),上級(jí)指揮機(jī)關(guān)也有通過遠(yuǎn)程監(jiān)控視頻來及時(shí)了解裝備運(yùn)行狀態(tài)的需要。因此,需要制作一套適用于車載裝備的多路視頻遠(yuǎn)程監(jiān)控系統(tǒng)。
四路視頻均采用H264格式進(jìn)行壓縮,視頻流基于RTSP協(xié)議通過以太網(wǎng)進(jìn)行推送。視頻流既可以使用通過的網(wǎng)關(guān)直連網(wǎng)絡(luò)實(shí)現(xiàn)有線以太網(wǎng)傳輸,也可以通過車載的數(shù)傳電臺(tái)通過無線以太網(wǎng)進(jìn)行傳輸。系統(tǒng)要求在不額外增加現(xiàn)有硬件的條件下,對(duì)四路視頻同時(shí)進(jìn)行監(jiān)控或錄制,回放時(shí)也能同步播放。因此,該監(jiān)控系統(tǒng)的重點(diǎn)和難點(diǎn)主要在于多路視頻遠(yuǎn)程監(jiān)控軟件的編寫。
目前,關(guān)于多路視頻監(jiān)控的研究,多采用研發(fā)刻錄儀或采用硬盤錄像機(jī)等增加硬件的方式來實(shí)現(xiàn)。如,王昱人選用TMS320DM8168和FPGA架構(gòu)作為硬件平臺(tái),在Linux下采用Qt開發(fā)了相應(yīng)軟件,研發(fā)了一款車載記錄儀,可同時(shí)記錄3路視頻并回放所記錄的視頻[1];胡偉基于AM5728多核處理器開發(fā)了一套嵌入式多路視頻錄制系統(tǒng)軟件[2];鄭超等利用硬盤錄像機(jī)等硬件設(shè)備,將視頻實(shí)時(shí)存儲(chǔ)并進(jìn)行統(tǒng)一調(diào)度,完成對(duì)現(xiàn)場(chǎng)作業(yè)多路視頻同步展示功能的升級(jí)[3]。文獻(xiàn)中在實(shí)現(xiàn)多路視頻監(jiān)控時(shí),除了多數(shù)要增加硬件設(shè)備外,大多數(shù)都不能同步保存多路視頻,且在回放記錄的視頻時(shí),通常只能回放其中一路視頻。所以有必要獨(dú)立開發(fā)一套多路視頻遠(yuǎn)程監(jiān)控軟件。
基于軟件今后潛在的跨平臺(tái)能力需求,本軟件在設(shè)計(jì)時(shí)盡量考慮使用跨平臺(tái)性好的開發(fā)工具或程序庫,因此,使用了Qt和FFmpeg來進(jìn)行開發(fā)。
FFmpeg是一套開源的計(jì)算機(jī)程序,可以用來對(duì)音頻/視頻進(jìn)行編碼、解碼、轉(zhuǎn)換等操作。FFmpeg也具有較高的可移植性,它雖然是在Linux平臺(tái)下開發(fā)的,但它同樣也可以在其他操作系統(tǒng)環(huán)境中編譯運(yùn)行,包括Windows、Mac OS X等。由于FFmpeg的功能強(qiáng)大和編解碼速度較高,目前得到了普遍的應(yīng)用[5],在有些商業(yè)軟件中也得到了采用。
多路視頻遠(yuǎn)程監(jiān)控系統(tǒng)軟件有兩種工作模式,一種是遠(yuǎn)程網(wǎng)絡(luò)視頻監(jiān)控模式,一種是歷史視頻記錄文件回放模式。因此,需要通過一個(gè)變量來表征當(dāng)前的視頻來源是通過以太網(wǎng)傳輸過來的四路視頻流,還是四個(gè)記錄文件中的視頻流。
為了方便對(duì)多路視頻的處理,將視頻的解碼及記錄等操作寫成了一個(gè)視頻處理類,對(duì)每路視頻流建立相應(yīng)的視頻處理類對(duì)象即可。視頻處理類軟件確定視頻源后,把視頻流輸入給視頻處理類的解碼線程隊(duì)列進(jìn)行解碼操作,生成對(duì)應(yīng)視頻幀的圖像。如果在此過程中檢測(cè)到了開始保存記錄標(biāo)志,則同時(shí)把視頻幀保存到本地文件中。解碼得到的視頻圖像在對(duì)應(yīng)的視頻窗體中予以顯示。
多路視頻遠(yuǎn)程監(jiān)控系統(tǒng)軟件的總體結(jié)構(gòu)框圖如圖1所示。
圖1 多路視頻遠(yuǎn)程監(jiān)控系統(tǒng)軟件總體結(jié)構(gòu)框圖
視頻解碼的流程如圖2所示。
圖2 視頻解碼流程
視頻解碼程序采用了兩個(gè)線程,一個(gè)線程專門負(fù)責(zé)從RTSP視頻流或本地視頻記錄文件中讀取視頻流,獲得視頻信息并打開對(duì)應(yīng)的解碼器,然后循環(huán)提取出每一個(gè)視頻壓縮包,并加入到視頻包隊(duì)列的隊(duì)尾;另一個(gè)線程專門負(fù)責(zé)解碼,它從視頻包隊(duì)列中提取隊(duì)首的視頻壓縮包,把它發(fā)送到解碼器中進(jìn)行解碼,由于根據(jù)編碼壓縮設(shè)置的不同,有可能會(huì)有多個(gè)圖像幀,因此需要循環(huán)讀取解碼后得到的圖像幀數(shù)據(jù),此圖像幀是YUV格式,還不能直接顯示,需轉(zhuǎn)換成RGB格式后生成QImage對(duì)象,然后拷貝出一個(gè)復(fù)本,用emit()函數(shù)作為一個(gè)信號(hào)(SIGNAL)發(fā)送出去,視頻窗體把此信號(hào)與用于顯示的槽函數(shù)(SLOT)連接起來,接收到此圖像后即通過此槽函數(shù)在窗體中進(jìn)行顯示,即完成了一個(gè)視頻圖像幀的顯示。如此循環(huán),則能顯示整個(gè)視頻。
3.2.1 視頻記錄文件的自動(dòng)命名
在點(diǎn)擊工具欄按鈕“開始保存視頻記錄”后,軟件便開始記錄各通道的視頻,并自動(dòng)創(chuàng)建一個(gè)以開始記錄時(shí)間命名的文件夾,各個(gè)視頻通道對(duì)應(yīng)的視頻記錄文件都保存在這個(gè)文件夾中。視頻記錄的文件名也由程序自動(dòng)給出,命名規(guī)則為“ch+視頻通道號(hào)+下劃線+開始記錄時(shí)間.mp4”。其中,時(shí)間用“年月日_時(shí)分秒”格式表示,時(shí)分秒的中間用中文全角的分號(hào)隔開。例如,2021年8月16日9點(diǎn)10分30秒開始錄制通道2的視頻,其文件名命名為ch2_20210816_09:10:30.mp4,該文件及其他通道同步錄制的文件都保存在20210816_09:10:30文件夾下。
3.2.2 創(chuàng)建文件,寫入MP4視頻文件頭
先調(diào)用avformat_alloc_output_context2()函數(shù)初始化一個(gè)用于輸出的AVFormatContext結(jié)構(gòu)體;再調(diào)用avio_open()函數(shù)創(chuàng)建按上面命名規(guī)則命名的文件并以讀寫模式打開它,以供寫入;之后再調(diào)用avformat_write_header()寫入MP4格式的文件頭。
3.2.3 循環(huán)讀取視頻幀數(shù)據(jù)并寫入文件
在解碼視頻的線程中,循環(huán)讀取視頻輸入流,并根據(jù)輸出封裝格式重新計(jì)算每包的pts和dts值,然后使用av_interleaved_write_frame()函數(shù)把獲取到的視頻幀數(shù)據(jù)依次寫入到輸出流中。
3.2.4 寫入MP4視頻文件尾,結(jié)束保存操作
收到停止記錄視頻命令時(shí),調(diào)用av_write_trailer()函數(shù)寫入MP4文件尾,調(diào)用avcodec_close()函數(shù)關(guān)閉編碼器,調(diào)用avio_close()函數(shù)關(guān)閉文件,再執(zhí)行必要的資源清理工作,即完成了視頻的保存操作。
軟件主界面如圖3所示。主界面左側(cè)為視頻的歷史記錄區(qū),視頻列表為每次記錄視頻的時(shí)間,雙擊列表中的記錄,可以同時(shí)把列表對(duì)應(yīng)的四路視頻記錄文件打開,并同步回放在四個(gè)視頻窗體中。主界面的右側(cè)分成上下兩部分,上方是工具欄,可快速切換視頻來源,以選擇是遠(yuǎn)程網(wǎng)絡(luò)視頻監(jiān)控還是回放本地視頻記錄文件模式;通過工具欄,還可進(jìn)行視頻的保存與播放控制等操作;下方是視頻窗體區(qū),分別顯示四路視頻的圖像。在四個(gè)視頻窗體大小均等的情況下,雙擊任意一個(gè)視頻窗體都可以全屏顯示該路視頻。
圖3 軟件主界面
為了突出顯示某路視頻,也可以把當(dāng)前的四路視頻均等大小顯示,改為一路主視頻、三路副視頻的“一主三副”顯示風(fēng)格,如圖4所示。此時(shí),雙擊右側(cè)的任意一個(gè)副視頻都可以將此路視頻與主視頻區(qū)的視頻進(jìn)行互換位置顯示,雙擊主視頻區(qū)的視頻,則能將主視頻區(qū)中的該路視頻全屏顯示。
圖4 “一主三副”顯示效果
本文基于Qt軟件開發(fā)框架,設(shè)計(jì)開發(fā)了一套遠(yuǎn)程多路視頻監(jiān)控軟件,在不額外增加硬件設(shè)備的情況下,實(shí)現(xiàn)了對(duì)車載裝備上的兩個(gè)相機(jī)和兩個(gè)攝像頭產(chǎn)生的四路視頻的遠(yuǎn)程監(jiān)控和同步記錄,并能方便地同步回放已記錄的四路視頻數(shù)據(jù)。本文設(shè)計(jì)開發(fā)的軟件經(jīng)過測(cè)試,達(dá)到了設(shè)計(jì)要求,且具有功能完備、操作簡(jiǎn)單、運(yùn)行穩(wěn)定等優(yōu)點(diǎn)。而且,由于采用了跨平臺(tái)的開發(fā)工具,軟件具有良好的可移植性,可方便地移植到其他平臺(tái)使用。