最近由于某些原因剛好研究了下GB28181中的音視頻封裝,秉著事情無論具細都記錄下的原則,記錄下。
GB28181是公共安全視頻監控聯網系統信息傳輸、交換、控制技術要求,最近幾年才出來的安防新標準,旨在統一各種攝像頭監控設備的各種協議,實現全網接入,既然是公安部出的標準,肯定是非常重要啦,想接入政府部門可能都得實現這個協議。
其音視頻封裝部分,分為兩種:1、對講類型,2、廣播類型;
下面聊聊對講類型的一些音視頻封裝,文檔中的說明有時給我的感覺并不是很全面。
媒體流:采用PS流的格式,按照ISO/IEC 13818-1標準,先將ES流(也就是原始的編碼后的H264或者音頻G711格式的數據)都打包成PES。然后將PES打包成PS;這里分為兩種,一種是I幀的PS,需要在PS頭部添加System header,然后再PES前面添加一個特殊的PES,叫PSM(program stream map),這也是一種PES,比較特殊;
所以對于包含I幀的視頻格式就是(注意,這里PESA可以多個,原來的文檔寫得模棱兩可,只有一個PESA)
PS包頭 | System header | PSM | PESV | PESA | PESA... |
---|
另外一種是P幀的視頻,這種視頻不需要添加Sytem header及PSM格式為:
PS包頭 | PESV | PESA | PESA... |
---|
將音視頻數據打包成上面的格式后,使用RTP封包,封成多個RTP包發送,最后一個包marker位為1。
另外注意音頻采樣率及通道數要求。
最后通過網絡io發送給服務端。
這里還有個問題吐槽,PS流按照這種封裝格式,PS流按照文檔上的說法主要是在存儲比如CD存儲中使用,而傳輸一般使用TS;
這里就需要看MPEG-TS文檔中的說明,TS和PS是對PES處理的兩個相反的過程,PS將若干個PES打包為一個PS包,而TS將一個PES拆分成多個TS包,每個包大小固定188字節,最后如果不夠就填充。PS其實是不利于網絡傳輸的,對于基于UDP的RTP而言,丟包是很正常的,按到里應該采用TS更加合理,但是不明白為什么GB28181采用PS來傳輸,如果中間丟了一個包,整個PS流都無法還原,而TS丟包只影響一個PES而已。