視頻直播流媒體服務器的http-flv是如何直播的?


我們的流媒體服務器可以輸出三種格式的視頻流,Http-Flv 就是 http+flv ,將音視頻數據封裝成FLV格式,然后通過 HTTP 協議傳輸給客戶端。相較於 RTMP 協議,HTTP-FLV 能夠好的穿透防火牆,它是基於 HTTP/80 傳輸,有效避免被防火牆攔截。那么本篇的問題就來了,http-flv是如何直播的?

這里我們主要研究HTTP-FLV和HLS。主流的幾個web直播平台幾乎都是以HTTP-FLV為主來直播的,首先我們都知道在媒體格式里,幾乎都以H264視頻編碼為主。如今HTTP-FLV直播的FLV數據也都是H264&AAC為主的。FLV封裝單元是以tag來表示的,一個tag可以是音頻tag或者視頻tag,或者腳本tag及其其他類型。

值得注意的是flv里面字節序是網絡字節序:

flv的格式

1 flvheader+[腳本tag(metadata)]+[第一個視頻tag(h264_spspps)]+[第一個音頻tag(aac_header)]+[第二個視頻tag(h264第一個關鍵幀)]+ 后面就是音頻和視頻tag交互存在

tag的格式

1 TYPE[1byte] + body size[3byte] + timestamp [4byte] +streamID [3byte] +[body data]+[previousTagSize 4byte]

這里的timestamp是這樣存在的[ time tamp 3b,time tamp ex 1b]

h264視頻tagbody

這里存儲的h264是沒有nal分割符的,在t的body里面是這樣存儲的,

[isKeyFrame(1byte)]+0x01+[compositionTime 3byte]+[h264 size 4byte]

compositionTime是h264編碼結果dts和pts之間的偏移。
aac視頻tag的body:

0xaf+0x01+aac raw

以上就是flv格式的詳細說明,可以看出格式簡單,封裝的前后數據關聯很小,當我們得到音頻頭和視頻頭,就可以從后面任意的一個關鍵幀開始播放。

當然想要HTTP-FLV正常播放,不能缺少matedata,就是第一個腳本tag里面,這里面指定了分辨率,音視頻編碼格式等。

HTTP-FLV直播實際上單純就是往客戶端發送flvtag,當然是先發送flv前面那幾個關鍵的tag,然后第一幀是關鍵幀。

假如客戶端是obs推流軟件,以rtmp方式向服務器推流,在開始握手及其創建stream完成以及發送Metadata完成,及其一系列數據發送完畢,服務器就向obs發送publish result指令,此后,obs就開始向服務器推送flv tag數據,開始直播,而服務器也得到了flv數據。

當某個客戶端想要來獲取直播數據,比如httpflv的方式來觀看直播,服務器會怎么做呢?

服務器會先發送前面幾個flvtag,header+metadata+spspps+aacheader,當這幾個tag發送完畢,服務器會從直播流tag中,找到最新的視頻關鍵幀tag,從這個關鍵幀tag開發數據,為什么呢?因為視頻流是IBP幀相互存在的,I是完整數據,BP解碼都需要I幀和前面的幀,所以,正常視頻數據,必須是從I幀開始發送的。這里就涉及到gop間距了,rtmp低延時秒開就是這個原理。當然發送的時候,每個連接的tag開始時間戳要從0開始遞增的。

至此,http-flv客戶端就可以接收到flv流數據,解碼觀看直播了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM