周新虹 宋維
(山東電子職業(yè)技術(shù)學(xué)院 電子與通信工程系 山東省濟(jì)南市 250200)
H.264 是一種低碼率視頻數(shù)據(jù)壓縮算法,其在視頻監(jiān)控、視頻會(huì)議、視頻巡檢等領(lǐng)域都有著廣泛的應(yīng)用。H.264視頻壓縮格式適合于各種組網(wǎng)模式,包括一點(diǎn)對多點(diǎn)的服務(wù)器-客戶端結(jié)構(gòu),以及點(diǎn)對點(diǎn)的服務(wù)器-服務(wù)器結(jié)構(gòu)等。由于H.264視頻壓縮格式在以太網(wǎng)上傳輸?shù)谋憬菪?,所以可以考慮使用協(xié)議分析技術(shù),從以太網(wǎng)傳輸?shù)臄?shù)據(jù)中直接獲取H.264視頻流,并對其進(jìn)行數(shù)據(jù)過濾,得到用戶指定MAC 地址(或IP 地址)的視頻源所傳輸?shù)腍.264視頻流,解碼后,實(shí)現(xiàn)本機(jī)的視頻實(shí)時(shí)播放。
通過協(xié)議分析技術(shù)實(shí)現(xiàn)的H.264視頻顯示終端具有以下優(yōu)點(diǎn):
多點(diǎn)性是指視頻顯示終端可以在以太網(wǎng)內(nèi)進(jìn)行多點(diǎn)安裝,實(shí)現(xiàn)多點(diǎn)視頻顯示。用戶在安裝顯示終端時(shí),只需考慮網(wǎng)絡(luò)數(shù)據(jù)是否能夠到達(dá)即可,不受安裝位置等其它條件束縛。對于跨網(wǎng)段的以太網(wǎng)架構(gòu),可以將顯示終端安裝在路由器的外網(wǎng)出口,這樣就可以監(jiān)聽到當(dāng)前網(wǎng)段內(nèi)的所有數(shù)據(jù),以實(shí)現(xiàn)對當(dāng)前網(wǎng)段內(nèi)所有H.264視頻的監(jiān)控。
便捷性是指視頻顯示終端不僅可以使用PC 機(jī)實(shí)現(xiàn),也可以使用裝有Linux 操作系統(tǒng)的嵌入式設(shè)備予以實(shí)現(xiàn)。由于,嵌入式設(shè)備具有體積小、功耗低、易攜帶、易安裝等顯著特點(diǎn),所以終端可以便捷地安裝到網(wǎng)絡(luò)中的指定位置,方便快捷。
高效性是指視頻顯示終端的使用不占用現(xiàn)有以太網(wǎng)的任何帶寬,這是由于論文所述的視頻顯示終端僅對接收以太網(wǎng)中傳輸?shù)臄?shù)據(jù)進(jìn)行分析和監(jiān)控,而不向以太網(wǎng)發(fā)送任何數(shù)據(jù),所以論文所述的視頻顯示終端的加入不會(huì)影響原有以太網(wǎng)中的數(shù)據(jù)的傳輸效率,具有高效性的特點(diǎn)。
過濾性是指視頻顯示終端可以對用戶感興趣的特定視頻流進(jìn)行監(jiān)控,這是由于H.264視頻流是封裝在以太網(wǎng)數(shù)據(jù)報(bào)中,而現(xiàn)有的以太網(wǎng)均采用TCP/IP 協(xié)議,在對TCP/IP 協(xié)議進(jìn)行解碼時(shí),可以獲得視頻流傳輸?shù)脑碝AC 地址(或IP地址),以及目標(biāo)MAC 地址(或IP 地址),借助取得的MAC 地址(或IP 地址),可以對視頻流進(jìn)行過濾和整理,從而使終端能夠顯示用戶希望看到的H.264視頻流。
保密性是指視頻顯示終端加入以太網(wǎng)后,以太網(wǎng)中的其它計(jì)算機(jī)設(shè)備不能發(fā)現(xiàn)視頻顯示終端的存在,其原因還在于視頻顯示終端是單純的數(shù)據(jù)接收設(shè)備,而不向網(wǎng)絡(luò)中發(fā)送任何其它數(shù)據(jù),所以視頻顯示終端加入以太網(wǎng)后,其它計(jì)算機(jī)設(shè)備是察覺不到當(dāng)前視頻顯示終端的存在,以及安裝的具體位置。
H.264 是ITU-T 和ISO 組建的聯(lián)合視頻組(JVT)制定的數(shù)字視頻編碼標(biāo)準(zhǔn)[1],是當(dāng)前互聯(lián)網(wǎng)上廣為流行的視頻編碼壓縮標(biāo)準(zhǔn),其主要采用以下3種方法對視頻進(jìn)行壓縮,包括[2]:
(1)幀內(nèi)預(yù)測壓縮:解決空域數(shù)據(jù)冗余問題;
(2)幀間預(yù)測壓縮:解決時(shí)域數(shù)據(jù)冗余問題;
(3)整數(shù)離散余弦變換:將空間上的相關(guān)性變?yōu)轭l域上的無關(guān)數(shù)據(jù),進(jìn)行量化。
視頻幀經(jīng)過H.264 算法進(jìn)行壓縮后,將分為:I 幀、P幀和B 幀,解釋如下[2]:
I 幀:關(guān)鍵幀,采用幀內(nèi)壓縮技術(shù);
P 幀:前向參考幀,在壓縮時(shí),只參考前面已處理的幀;
B 幀:雙向參考幀,在參考前序幀及后續(xù)幀的基礎(chǔ)上進(jìn)行壓縮。
RTSP(Real Time Streaming Protocol)稱為實(shí)時(shí)流協(xié)議,是一種用于直接處理流媒體的傳輸協(xié)議,其協(xié)議本身雖不需連續(xù)發(fā)送流媒體數(shù)據(jù),但通過協(xié)議控制,可以建立并控制多個(gè)時(shí)間同步的連續(xù)流媒體[3]。所以,RTSP 是當(dāng)前互聯(lián)網(wǎng)上最為流行的流媒體服務(wù)器控制協(xié)議,與H.264 相結(jié)合,各取所長,可以完成互聯(lián)網(wǎng)上高質(zhì)量、低碼率的視頻傳輸。
RTSP[4]含有RTP 數(shù)據(jù),RTP 全稱是Real Time Transport Protocol,由IETF 的多媒體傳輸小組與1996年在RFC1889中公布,并在RFC3550 中進(jìn)行更新。RTP 是TCP/IP 協(xié)議簇的上層協(xié)議,位于應(yīng)用層,使用TCP 或UDP 來傳輸流媒體數(shù)據(jù),所以,從RTSP 中提取H.264視頻流,需正確解析TCP/IP 傳輸層和網(wǎng)絡(luò)層的協(xié)議數(shù)據(jù)。
論文所述方案的整體分析流程如圖1所示,可分為pcapng 的整體解包、解析接口描述塊、解析增強(qiáng)分組塊、解析TCP/IP 鏈路層、解析TCP/IP 的IP 協(xié)議、解析TCP/IP 的TCP 協(xié)議、解析RTSP Interleaved Frame 協(xié)議、解析RTP 協(xié)議8 個(gè)步驟,最終在本地文件中存儲(chǔ)H.264視頻流,該視頻流可通過PotPlayer、VLC media player 等播放器實(shí)時(shí)播放。
圖1:分析流程
提取H.264視頻流,首先需要捕獲原始網(wǎng)絡(luò)數(shù)據(jù),根據(jù)操作系統(tǒng)的不同,可以選用tcpdump、netsniff-ng、iptraf、argurs、iftop 等,這些軟件抓包后,一般都會(huì)存儲(chǔ)為pcapng格式,所以解析RTSP,首先需要對pcapng 格式進(jìn)行分析。pcapng 是IETF(互聯(lián)網(wǎng)工程工作組)定義的新一代pcap 格式,有效提升了pcap 的可擴(kuò)展性及邏輯性。
pcapng 由各種塊(block)組成,每種塊都有統(tǒng)一的結(jié)構(gòu),如表1所示。
表1:pcapng 的塊結(jié)構(gòu)
根據(jù)塊類型的不同,pcapng 的塊可以分為:節(jié)頭塊(Section Header Block)、接口描述塊(Interface Description Block)、分組塊(Packet Block)、簡單分組塊(Simple Packet Block)、名稱解析塊(Name Resolution Block)、接口統(tǒng)計(jì)塊(Interface Statistics Block)、增強(qiáng)分組塊(Enhanced Packet Block)。
在上述的塊中,pcapng 使用二進(jìn)制標(biāo)識(shí)予以區(qū)分,每種塊類型有不同的二進(jìn)制標(biāo)識(shí),對于提取RTSP 數(shù)據(jù),應(yīng)解析接口描述塊和增強(qiáng)分組塊。圖2 是應(yīng)用Python 語言對pcapng 的整體解包分析結(jié)果,可見pcapng 是由1 個(gè)節(jié)頭塊、1 個(gè)接口描述塊和多個(gè)增強(qiáng)分組塊構(gòu)成的。
圖2:pcapng 的整體解包分析結(jié)果
pcapng 的接口描述區(qū)塊具有強(qiáng)制性。該區(qū)塊用于指定網(wǎng)絡(luò)接口的特性,以便進(jìn)行捕獲。接口描述塊必須在使用它的其他任何塊之前定義,以便將捕獲的數(shù)據(jù)關(guān)聯(lián)到相應(yīng)的接口;因此,這個(gè)區(qū)塊通常會(huì)緊隨節(jié)點(diǎn)區(qū)塊放置,如表2所示的界面描述區(qū)塊的結(jié)構(gòu)。
表2:接口描述塊結(jié)構(gòu)
接口描述塊中,常用鏈路類型有LINKTYPE_ETHERNET、LINKTYPE_AX25 等,解析接口描述塊的主要目的在于確認(rèn)當(dāng)前pcapng 包是否是D/I/X and 802.3 Ethernet 鏈路類型。應(yīng)用Python 語言對接口描述塊進(jìn)行解析后的結(jié)果如圖3所示,正確解析后可獲得鏈路類型、設(shè)備名稱、流量捕獲過濾端口等信息。
圖3:接口描述塊解析結(jié)果
pcapng 的增強(qiáng)分組塊是用來存儲(chǔ)來自網(wǎng)絡(luò)的數(shù)據(jù)報(bào)的標(biāo)準(zhǔn)容器,當(dāng)前所有的抓包軟件都優(yōu)先采用增強(qiáng)分組塊來存儲(chǔ)數(shù)據(jù),增強(qiáng)分組塊的結(jié)構(gòu)如表3所示,從網(wǎng)絡(luò)中捕獲的數(shù)據(jù)存儲(chǔ)于Packet Data 字段中,其包括從鏈路層開始的完整的報(bào)頭。
表3:增強(qiáng)分組塊的結(jié)構(gòu)
可以使用Python 語言對增強(qiáng)分組塊進(jìn)行解析,如圖4所示,獲得增強(qiáng)分組塊的具體長度等信息,已定位H.264視頻數(shù)據(jù)。
圖4:增強(qiáng)分組塊解析結(jié)果
TCP/IP 為4 層網(wǎng)絡(luò)協(xié)議架構(gòu),分別為:鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。鏈路層為TCP/IP 協(xié)議的最底層,其最靠近硬件鏈路,在封裝上可以分為IEEE802.2/802.3 和RFC 894,其中RFC 894 廣泛應(yīng)用于以太網(wǎng),具體格式如表4所示。
表4:RFC 894 封裝結(jié)構(gòu)
TCP/IP 鏈路層數(shù)據(jù)存儲(chǔ)于pcapng 增強(qiáng)分組塊的Packet Data 字段中,通過其結(jié)構(gòu)可正確解析出目的MAC 地址、源MAC 地址,以及上層協(xié)議數(shù)據(jù)報(bào),通過源MAC 地址、目的MAC 地址可以完成MAC 地址的過濾,圖5 是應(yīng)用Python 語言對TCP/IP 的鏈路層進(jìn)行解析的結(jié)果。
圖5:TCP/IP 鏈路層的解析結(jié)果
IP 協(xié)議是TCP/IP 協(xié)議簇中最核心的協(xié)議,處在網(wǎng)絡(luò)層中,所有TCP、UDP、ICMP 和IGMP 協(xié)議的數(shù)據(jù)均以IP數(shù)據(jù)報(bào)格式傳輸,表5 為IP 協(xié)議的封裝結(jié)構(gòu)。
表5:IP 協(xié)議封裝結(jié)構(gòu)
解析鏈路層,通過標(biāo)識(shí)0800 可以正確獲取IP 協(xié)議,通過IP 協(xié)議封裝結(jié)構(gòu)可以解析出源IP 地址,目的IP 地址,以及上層協(xié)議數(shù)據(jù)報(bào)。IP 地址的過濾可以通過源IP 地址,目的IP 地址來完成。圖6 是應(yīng)用Python 語言解析TCP/IP協(xié)議的IP 協(xié)議的結(jié)果。
圖6:TCP/IP 協(xié)議的IP 協(xié)議解析結(jié)果
TCP 協(xié)議是TCP/IP 協(xié)議簇中的傳輸層協(xié)議,其向應(yīng)用層提供一種面向連接的、可靠的字節(jié)流服務(wù),TCP 協(xié)議的封裝結(jié)構(gòu)如表6所示。
表6:TCP 協(xié)議封裝結(jié)構(gòu)
正確解析TCP 協(xié)議可以獲取源端口號(hào)、目的端口號(hào)、序號(hào)和確認(rèn)序號(hào)等信息,通過對序號(hào)和確認(rèn)序號(hào)進(jìn)行判別,可以正確獲得數(shù)據(jù)報(bào)次序,以及掌握數(shù)據(jù)報(bào)的丟包情況和錯(cuò)誤重傳,圖7 是TCP/IP 的TCP 協(xié)議的解析結(jié)果。
圖7:TCP/IP 的TCP 協(xié)議解析結(jié)果
Interleaved Frame 稱為交錯(cuò)幀,是RTSP 中的一種格式,文檔[3]對其進(jìn)行了具體的描述,它可以讓RTSP 信息和流媒體數(shù)據(jù)交錯(cuò)使用,RTSP 應(yīng)用TCP/IP 協(xié)議中傳輸層的TCP協(xié)議進(jìn)行數(shù)據(jù)傳輸,通過解析TCP 協(xié)議可獲得Interleaved Frame 數(shù)據(jù),其封裝結(jié)構(gòu)如表7所示。
表7:RTSP Interleaved Frame 封裝結(jié)構(gòu)
正確解析RTSP Interleaved Frame 協(xié)議,可獲得RTSP 的數(shù)據(jù)類型,判定后續(xù)存儲(chǔ)的是視頻數(shù)據(jù),還是音頻數(shù)據(jù),以及數(shù)據(jù)的實(shí)際長度,圖8 是RTSP Interleaved Frame 協(xié)議的解析結(jié)果。
圖8:RTSP Interleaved Frame 協(xié)議的解析結(jié)果
RTSP Interleaved Frame 數(shù)據(jù)幀中包含RTP 數(shù)據(jù),其帶有不同數(shù)據(jù)編碼的有效載荷,例如PCMU、H.264、MPEG 等,可以根據(jù)RTP 的封裝結(jié)構(gòu)對其進(jìn)行解析,以獲取實(shí)際的視頻數(shù)據(jù),RTP 的封裝結(jié)構(gòu)如表8所示。
表8:RTP 封裝結(jié)構(gòu)
圖9 是應(yīng)用Python 語言對RTP 協(xié)議進(jìn)行解析的結(jié)果,從圖中可以看出,當(dāng)前數(shù)據(jù)報(bào)的有效數(shù)據(jù)載荷是H.264。
圖9:RTP 協(xié)議的解析結(jié)果
正確解析RTP 協(xié)議可獲得實(shí)際存儲(chǔ)的視頻數(shù)據(jù),以及其有效載荷類型。對RTP 中的數(shù)據(jù)進(jìn)行判斷,向本地文件中存儲(chǔ)有效載荷類型為H.264 的視頻數(shù)據(jù),即可得到網(wǎng)絡(luò)上傳輸H.264視頻壓縮數(shù)據(jù)的數(shù)據(jù)流。對于存儲(chǔ)后的數(shù)據(jù),可通過PotPlayer、VLC media player 等播放器進(jìn)行實(shí)時(shí)播放,如圖10所示。
圖10:視頻數(shù)據(jù)的實(shí)時(shí)播放
基于論文所述方案實(shí)現(xiàn)的多點(diǎn)H.264視頻顯示終端相對于傳統(tǒng)的視頻顯示終端技術(shù),具有多點(diǎn)性、便捷性、高效性、過濾性和保密性等優(yōu)點(diǎn),為視頻監(jiān)控、傳輸、回放和顯示等領(lǐng)域提供了一種高性能、可擴(kuò)展的解決方案。采用本方案實(shí)現(xiàn)的視頻顯示終端已經(jīng)在視頻監(jiān)控、視頻會(huì)議、視頻巡檢等多種場合中,進(jìn)行了實(shí)際應(yīng)用,取得了較好的效果。