郝 朝,王 灝
(中國飛行試驗研究院,陜西 西安 710089)
機載視頻數據是飛行試驗測試數據中的重要組成部分,視頻圖像因為全面、直觀、真實地反映當前飛機與設備工作狀態等優點成為試飛工程師給出飛機試飛結論的重要依據[1]。
目前在飛行試驗中,視頻遙測與監控仍然采用主流的PCM[2]架構,將機載數字視頻信號以PCM流的形式傳輸至地面進行解析。一般航電系統多路視頻數據使用機載記錄器對其進行分開記錄,飛行結束后,通過地面卸載將各路視頻數據還原為標準視頻格式文件(*.m2t),采用通用視頻播放軟件如暴風影音即可進行播放。隨著基于Mesh架構[3-4]的網絡電臺的出現,由于任務需求,機載視頻通過網絡電臺以RTP/RTCP協議的網絡數據包的形式實現網絡化遙測與記錄,有別于現有的PCM結構的遙測數字視頻傳輸系統,視頻數據與其他測試參數以網絡數據包的形式全部記錄在一個網絡數據文件(*.enet)中。因為機載采集系統和遙測傳輸方式的改變,導致記錄的視頻數據格式發生變化,現有的視頻回放軟件無法滿足型號任務新需求。
根據以上需求,為了保證機載多路網絡視頻數據回放任務,研究基于RTP/RTCP[5-6]的機載網絡視頻同步回放技術。通過對機載記錄網絡數據進行提取,將網絡視頻數據分流并進行預處理,使用FFmpeg進行圖像解碼,并利用SDL進行顯示。
機載網絡攝像頭將視頻圖像以RTP/RTCP協議網絡數據包的形式通過交換機發送給記錄器進行記錄。記錄器將RTP/RTCP網絡數據包進行封裝,加上UDP頭、IP頭、MAC頭寫入文件中。
實時傳輸協議(real-time transport protocol,RTP)是用來為音視頻等多媒體數據提供端到端的實時傳輸服務。RTP實時傳輸音視頻流,傳輸服務質量由對應的實時傳輸控制協議(real-time transport control protocol,RTCP)來控制。在RTP會話期間,網絡攝像頭周期性地以組播形式發送RTCP包,包中含有已發送的視頻數據包數量、丟包數量等信息,因此,網絡攝像頭可以利用這些信息動態地改變視頻圖像的傳輸速率。
當網絡攝像頭開啟時,同時建立了一個RTP會話,確定了一個由一個網絡地址和奇偶兩個端口組成的目的傳輸地址。偶數的UDP端口2n分配給RTP視頻數據包,相鄰的奇數UDP端口2n+1分配給RTCP包,構成一個UDP端口對。RTP/RTCP數據包通過該UDP端口對進行發送。
RTP協議從網絡攝像頭接收視頻圖像碼流,將其進行封裝,得到RTP數據包;RTCP協議從網絡攝像頭接收控制信息,將其進行封裝成RTCP數據包。RTP和RTCP兩種協議的配合使用,可以通過有效的反饋和最小的開銷使視頻數據包的傳輸效率達到最優。
當采用RTP對H.264碼流進行打包封裝時,封裝格式定義三個不同的基本結構,接收端通過RTP包的第一個字節后5位來識別當前打包結構。
(1)單個封包模式:一個獨立的NALU用一個RTP包封裝。序列參數集SPS與圖像參數集PPS由于數據量較少,小于MTU(最大傳輸單元),一般為單個NALU,采用單個RTP包封裝模式進行傳輸。NAL頭類型域與原始 NAL單元類型相同。。
(2)聚合封包模式:用于將多個NAL單元打包到單個RTP數據包中。由于視頻圖像數據較大,一幀圖像數據量一般均大于RTP數據包長度,因此這種封裝格式應用較少。
(3)分片封包模式:將一個獨立的NALU打包到多個RTP包。一個獨立的NALU被分割成多個連續的NAL單元字節。相同NALU的分片必須使用遞增的RTP序號進行順序發送,可以通過該序列號判斷RTP數據包的丟包情況。相似地,NAL單元必須按照RTP順序號的順序進行封裝。
機載網絡視頻回放系統功能結構如圖1所示。

圖1 系統功能結構
對于機載記錄數據處理模塊,具體功能如下:
(1)數據分流:通過對數據包進行判別,將機載記錄網絡數據分流提取為普通低采數據、網絡視頻數據和高采振動數據等多個數據文件。
(2)視頻數據預處理:對網絡視頻數據文件進行處理,將RTP視頻數據包進行解封裝與組包,還原成完整的一幀圖像,對RTCP數據包進行解析,在每一幀圖像前加上標識符、時間戳、該幀圖像數據長度等信息。
對于視頻數據回放模塊,具體功能如下:
(1)多路視頻同步回放:實現多路視頻的同步回放,保持時間基本一致;
(2)逐幀播放:對關鍵數據段進行逐幀播放,包括上一幀和下一幀;
(3)數據截取:對關鍵數據段進行截取,保存為單獨的視頻文件;
(4)時間跳轉:實現快速跳轉至指定時間的視頻畫面;
(5)截圖:將當前時刻的圖像保存為BMP文件;
(6)視頻解碼:將一幀視頻圖像解碼為YUV數據;
(7)圖像顯示:利用SDL對YUV圖像數據進行顯示;
(8)圖像處理:采用一定算法實現圖像旋轉、1/4局部顯示等功能。
機載網絡視頻數據回放流程如圖2所示。
首先對機載記錄的數據文件進行處理,將網絡視頻數據分流出來,然后對網絡數據包進行解包、計算時間等預處理,形成可用于快速回放的數據文件。網絡遙測記錄的視頻數據包格式與預處理視頻數據文件保持一致,均可進行回放。通過讀取一幀數據送給FFmpeg進行解碼,然后調用SDL進行顯示。

圖2 數據回放流程
FFmpeg[7-9]是一個開源的、跨平臺的音視頻流方案,可對音視頻進行錄制、轉換以及流化的操作。libavcodec是一套先進的音頻/視頻編解碼庫,用于各種類型聲音/圖像的編碼與解碼。libavformat用于解析各種格式封裝的音視頻,包括獲取音視頻解碼所需的關鍵信息等功能;libswscale實現各種圖像像素格式的轉換以及圖像大小縮放功能。libavutil是一個公共工具函數庫。在獲得完整的NALU后,將其送入FFmpeg緩存進行解碼,解碼流程為:(1)初始化解碼器;(2)注冊容器和CODEC;(3)查找H.264解碼器;(4)打開H.264解碼器;(5)為解碼器分配內存;(6)解碼一幀視頻圖像,得到YUV數據。
SDL[10-11](simple direct media layer)是開源的、跨平臺的多媒體開發庫。SDL本身不具備字符顯示的功能,需要用外部擴展庫SDL_ttf顯示文字。SDL顯示YUV[12-13]數據流程為:(1)初始化SDL和TTF庫;(2)創建window,打開字體;(3)基于窗口創建渲染器;(4)創建圖像紋理,設置文本表面;(5)設置圖像紋理數據;(6)創建文本紋理數據;(7)將圖像紋理和文本紋理復制給渲染器。
機載記錄數據格式為標準的以太網數據包,格式為[MAC Header][IP Header][UDP Header][Payload]。記錄器將所有經過機載網絡交換機的數據包均記錄下來,包括普通數據、視頻數據、振動數據和其他網絡數據。因此首先采用數據分流技術將網絡攝像頭視頻數據提取出來。數據分流流程如圖3所示。

圖3 數據分流流程
將視頻數據提取出來之后,為了實現視頻數據的快速拖動回放,首先將對RTP協議封裝的H.264視頻數據進行解包,還原成完整的一幀NALU,在每一幀圖像數據前加上標識符、時間戳和數據長度。標識符代表一幀圖像的開始,時間戳代表當前圖像的時間,數據長度代表當前圖像所占字節數。
對多路視頻進行同步回放時,采用時間戳同步技術,將視頻畫面精確到幀。一般視頻幀率為25 fps,相鄰兩幀視頻畫面的時間差為40 ms,因此只需開始播放2路視頻畫面時間保持一致,逐幀順序播放顯示即可保持多路視頻之間同步。
在拖動進度條時,只需移動文件指針至指定位置,查找標識符直到一幀圖像開始。然后以某一路視頻為基準,對其他路視頻進行查找,當時間戳相差最小時,開始逐幀播放即可保持多路視頻間的同步。首先以視頻1為時間戳基準,讀取并顯示當前一幀圖像,然后該線程進入等待狀態并通知視頻2線程。視頻2線程依次讀取一幀圖像并計算當前時間差,如果該幀與基準幀時間差最小,則顯示該圖像并且通知視頻1線程讀取下一幀圖像。

圖4 時間跳轉邏輯處理流程
時間跳轉處理邏輯流程如圖4所示。首先讀取當前一幀數據,比較當前時間Tn(s)與指定時間Td(s),如果Tn
BMP[14-15]格式位圖文件是Windows操作系統中的標準圖像文件格式,是一種設備無關位圖。為了實現截圖功能,將YUV數據轉換為RGB數據,然后加上54字節的文件頭和位圖信息頭寫入BMP文件。
YUV與RGB的彩色空間變換關系[8]如下:

對變換得出的R、G、B值進行檢查,如果RGB數值大于255,則賦值為255;如果小于0,則賦值為0。
一個BMP圖像文件由位圖文件頭、位圖信息頭、調色板和位圖數據4部分組成[16]:
(1)位圖文件頭包含BMP位圖文件的類型、文件大小、位圖起始位置等信息,其結構定義如下:
struct stcBITMAPFILEHEADER
{
INT16 FileType; //必須為“BM”
INT32 FileSize; //文件大小
INT16 Reserved1; //為0
INT16 Reserved2; //為0
INT32 DataOffset; //位圖數據起始位置
};
(2)位圖信息頭數據結構。包含BMP圖像的尺寸、壓縮類型等信息,其結構定義如下:
struct stcBITMAPINFOHEADER
{
INT32 Size;//所占字節數
INT64 PicWidth; //寬度
INT64 PicHeight; //高度
INT16 Planes; //為1
INT16 Bits; //每個像素所需位數
INT32 CprssType; //壓縮類型
INT32 ImageSize;
INT64 XDPI; //水平分辨率
INT64 YDPI ; //垂直分辨率
INT32 lrUsed;
INT32 lrmajor;
};
當每個像素所需位數為1時,代表1個字節為8個像素;
當每個像素所需位數為4時,代表1個字節為2個像素;
當每個像素所需位數為8時,代表1個字節為1個像素;
當每個像素所需位數為24時,代表3個字節為1個像素。
(3)調色板。真彩色圖(24位的BMP)不需要調色板。
(4)位圖數據。按照行內從左到右、行間從下到上的順序對位圖的每一個像素值進行掃描。
機載多路網絡視頻數據同步回放界面如圖5所示,能夠實現多路網絡視頻數據文件的同步回放,具有暫停、上一幀、下一幀、截圖、圖像旋轉、時間跳轉等功能。

圖5 機載多路網絡視頻數據同步回放軟件界面
論述了多路機載網絡視頻數據同步回放系統的設計與實現。通過對網絡包數據進行分流提取,對RTP視頻數據包進行解包、時間計算等預處理形成預處理文件,采用FFmpeg和SDL對一幀圖像進行解碼與顯示,采用時間戳同步機制實現多路網絡視頻的精確同步回放。實際應用效果表明該系統能夠實現多路機載網絡視頻數據的快速同步回放,有效提高試飛效率。