1. 程式人生 > >流媒體協議—FLV

流媒體協議—FLV

認識FLV

上一篇講了HTTP在流媒體中的應用,接下來我們先把基於HTTP的HTTP-FLV和HLS兩種直播中應用非常廣泛的協議提一下。

先看看HTTP-FLV長成什麼樣子:http://ip:port/live/livestream.flv,協議頭是http,另外”.flv”這個尾巴是它最明顯的特徵。

在流媒體尤其是直播應用中,為什麼我們要如此重視HTTP-FLV呢,因為他的使用非常廣泛,可以這麼說,當下的直播平臺中大部分的主線路使用的都是HTTP-FLV協議,備線路多為RTMP。小編隨便在Safari中開啟幾個直播平臺房間,一抓包就不難發現使用HTTP-FLV協議的身影:熊貓、鬥魚、虎牙、B站。

FLV格式

在說HTTP-FLV之前,我們有必要對FLV adobe 官方標準有個認識,因為HTTP-FLV協議中封裝格式使用的是FLV。

FLV檔案格式標準是寫F4V/FLV fileformat spec v10.1的附錄E裡面的FLVFile Format。

▣  單位說明

▣  FLV 檔案頭和檔案體 (E.2,E.3)

從整個檔案上看,FLV = FLV FileHeader + FLV File Body。通常,FLV的前13個位元組(flv header + PreviousTagSize0)完全相同,所以, 程式中會單獨定義一個常量來指定。


▣  

FLV Tag (E.4)


Timestamp和TimestampExtended組成了這個TAG包資料的PT 資訊,PTS =Timestamp | TimestampExtended << 24。

▣  AudioTag (E.4.2)

由於AAC編碼的特殊性, 這裡著重說明了AAC編碼的Tag格式。


AudioTagHeader的第一個位元組,也就是接跟著StreamID的1個位元組包含了音訊型別,取樣率等的基本資訊。

AudioTagHeader之後跟著的就是AUDIODATA部分了。但是,這裡有個特例,如果音訊格式(SoundFormat)是 AAC,AudioTagHeader中會多出1個位元組的資料AACPacketType,這個欄位來表示AACAUDIODATA的型別: 0 = AAC sequence header,1 = AAC raw。

AudioSpecificConfig結構描述非常複雜,在標準文件中是用虛擬碼描述的,這裡先假定要編碼的音訊格式,做一下簡化。

音訊編碼為:AAC-LC, 音訊取樣率為 44100。


在FLV的檔案中,一般情況下AAC sequence header這種包只出現1次, 而且是第一個audio tag,為什麼需要這種tag,因為在做FLV demux的時候,如果是AAC的音訊,需要在每幀AAC ES流前邊新增7個位元組ADST頭, ADST是解碼器通用的格式, 也就是說AAC的純ES流要打包成ADST格式的AAC檔案,解碼器才能正常播放。就是在打包ADST的時候,需要samplingFrequencyIndex這個資訊,samplingFrequencyIndex最準確的資訊是在AudioSpecificConfig中,這樣,你就完全可以把FLV檔案中的音訊資訊及資料提取出來,送給音訊解碼器正常播放了。

▣  VideoTag (E.4.3)

由於AVC(H.264)編碼的特殊性,這裡著重說明了AVC(H.264編碼的Tag格式。


VideoTagHeader的第一個位元組,也就是接跟著StreamID的1個位元組包含著視訊幀型別及視訊CodecID等最基本資訊。

VideoTagHeader之後跟著的就是VIDEODATA部分了。但是,這裡有個特例,如果視訊格式(CodecID)是AVC,VideoTagHeader會多出4個位元組的資訊。

AVCDecoderConfigurationRecord包含著是H.264解碼相關比較重要的SPS和PPS資訊,在給AVC解碼器送資料流之前一定要把SPS和PPS資訊送出,否則的話,解碼器不能正常解碼。而且在解碼器stop之後再次start之前, 如seek,快進快退狀態切換等,都需要重新送一遍SPS和PPS的資訊。AVCDecoderConfigurationRecord在FLV檔案中一般情況也只出現1次, 也就是第一個video tag。

AVCDecoderConfigurationRecord長度為sizeof(UI8) * (11 +sps_size + pps_size)


▣  SCRIPTDATA (E.4.4)

ScriptTagBody內容用AMF編碼。


一個SCRIPTDATAVALUE記錄包含一個有型別的ActionScript值。

▣  onMetadata (E.5)

FLV metadata object儲存在SCRIPTDATA中,叫onMetaData。不同的軟體生成的FLV的properties不同。


▣  keyframes索引資訊

官方的文件中並沒有對keyframesindex做描述, 但是,flv的這種結構每個tag又不像TS有同步頭,如果沒有keyframes index的話,seek及快進快退的效果會非常差,因為需要一個tag一個tag的順序讀取。後來在做flv檔案合成的時候,發現網上有的flv檔案將keyframes資訊隱藏在ScriptTag中。keyframes幾乎是一個非官方的標準, 也就是民間標準。

兩個常用的操作metadata的工具是flvtool2和FLVMDI,都是把keyframes作為一個預設的元資訊專案。在FLVMDI的主頁上有描述:


也就是說keyframes中包含著2個內容‘filepositions’和‘times’分別指的是關鍵幀的檔案位置和關鍵幀的PTS。通過keyframes可以建立起自己的Index,然後在seek和快進快退的操作中,快速有效地跳轉到你想要找的關鍵幀位置進行處理。

▣  FLV分析工具

▲  http://www.flvmeta.com/

▲  yamdi:將flv轉成帶索引的flv,yamdi -i i.flv -o o.flv

▲  flvlib:pip install flvlib,檢視索引資訊:debug-flv--metadata file.flv

▲  flvchek:http://www.adobe.com/products/adobe-media-server-family/tool-downloads.html

HTTP-FLV

我們這裡說的HTTP-FLV,主要是說的是HTTP-FLV流,而不是基於HTTP的FLV視訊檔案點播,也不是能夠隨意SEEK的HTTP FLV偽流。

FLV漸進式下載:通過HTTP協議將FLV下載到播放器中播放,無法直接拉到中間去播放。

HTTP FLV偽流:支援SEEK,可從未下載的部分開始播放。

HTTP-FLV流:擁有和流式協議RTMP一樣的特徵,長連線,流式資料。

▣  HTTP-FLV技術實現

HTTP協議中有個content-length欄位的約定,即http的body部分的長度。伺服器回覆http請求時如果有這個欄位,客戶端就接收這個長度的資料然後認為資料傳輸完成了,開始播放。

如果伺服器回覆http請求中沒有這個欄位,客戶端就一直保持長連線接收資料,直到伺服器跟客戶端的socket斷開。

HTTP-FLV流就利用了上述的第二個原理,伺服器回覆客戶端請求的時候不加content-length欄位,在回覆了http內容之後,進行持續的資料傳送,客戶端就一直接收資料,以此實現了HTTP-FLV流直播。

資料傳輸依然是之前講過的內容,每一個音視訊資料都被封裝成包含時間戳資訊頭的資料包,封裝格式採用FLV,傳輸協議採用http。

▣  HTTP-FLV抓包分析

開啟熊貓TV的一條直播流:

http://175.25.168.16/pl3.live.panda.tv/live_panda/d4e0a83a7e0b0c6e4c5d03774169fa3e.flv?wshc_tag=0&wsts_tag=57e233b1&wsid_tag=6a27c14e&wsiphost=ipdbm

返回資訊如下:


我們發現響應頭中出現Connection:close的欄位,表示網宿採用的是短連線方式,直接通過伺服器關閉連線來確定訊息的傳輸長度。

還有一種實現方式,如果HTTP Header中有Content-Length,那麼這個Content-Length既表示實體長度,又表示傳輸長度。而HTTP-FLV這種流,伺服器是不可能預先知道內容大小的,這時就可以使用Transfer-Encoding:chunked模式來傳輸資料了。如下的響應就是採用的Chunked的方式進行的傳輸的響應頭:


▣  HTTP-FLV延遲分析

通過http-flv的實現中不難發現,HTTP-FLV的延遲方面和RTMP能夠保持一致。

▣  HTTP-FLV與其他流媒體協議的比較

當前,RTMP、HLS、HTTP-FLV是直播應用的三種主協議,說他主流,主要是因為國內所有的CDN都支援對它們的分發。這裡需要注意的是,有些廠商如網宿所指的HDL,國外所稱的HFL,本質上都是我們今天所講的HTTP-FLV協議。

觀止雲的BMS是在國內最早支援HTTP-FLV的流媒體伺服器,且相對於其他方案,觀止雲BMS叢集內部全走RTMP,只是在邊緣實時轉為HTTP-FLV。如此一來系統架構更簡單,穩定,且一路RTMP回源節省了不少回源流量。

❶  延遲比較

HTTP-FLV:低延遲,內容延遲可以低於3秒

RTMP:低延遲,內容延遲可以低於3秒

HLS::延遲較高,一般在10秒左右

❷  易用性比較

RTMP和HTTP-FLV:二者一樣,服務端需要專門的流媒體伺服器,播放端需要專門的FlashPlayer。但目前瀏覽器支援Flash較好,所以PC上的播放問題不大,移動端需要專門的SDK解碼。

HLS:更為易用,服務端就是WEB伺服器外加切片工具。播放端只要是蘋果裝置、HTML5平臺的瀏覽器均可直接播放。也就是說,移動端不論是IOS還是Android,微信,朋友圈等都可以直播播放HLS直播流。

❸  RTMP和HTTP-FLV的比較:

RTMP和HTTP-FLV延遲上保持一致,在這二者的區別如下:

▲  穿牆:很多防火牆會牆掉RTMP,但是不會牆HTTP,因此HTTPFLV更不容易出問題。

▲  排程:雖然RTMP也能支援302,單實現起來較麻煩。HTTP FLV本身就支援302,更方便CDN進行重定向以便更精準的排程。

▲  容錯: HTTP-FLV回源時也可以回多個源,能做到和RTMP一樣,支援多級熱備。

▲  簡單:FLV是最簡單的流媒體封裝,HTTP是最廣泛的協議,這兩個組合在一起維護性更高,比RTMP簡單。

▲  友好:HTTP-FLV程式碼量更小,整合SDK也更輕便。使用起來也更簡單。

綜上,HTTP-FLV協議具有RTMP的延遲優勢,又繼承了HTTP所有優勢,是流媒體直播首選的分發協議。

另外,HTTP-FLV也能在推流端實現,用HTTP進行資料推流。就同樣能在推流端實現上述一切優勢了,只是目前國內還沒有廠商實現。

相關推薦

媒體協議FLV

認識FLV 上一篇講了HTTP在流媒體中的應用,接下來我們先把基於HTTP的HTTP-FLV和HLS兩種直播中應用非常廣泛的協議提一下。 先看看HTTP-FLV長成什麼樣子:http://ip:port/live/livestream.flv,協議頭是http,另外

媒體協議之RTSP客戶端的實現20171014

叠代 jrtplib 訪問 pac .cpp 服務端 blog 文件 僅支持 RtspClient是基於jrtplib實現的,目前僅支持h264格式,後續將不斷叠代優化,加入對其他格式的支持,並且將實現RTSP的服務端。 RtspClient的功能是接收服務端過來流,然後寫

常用的媒體協議及其應用場景等信息總結

咨詢 視頻播放 專線 通過 區別 不同的 文件存儲 通用 其他 近日一直被直播延時問題所困惑,為此特整理一些關於常用流媒體的協議信息,希望能對自己解決直播延時有所幫助。 1.RTMP(Real Time Messaging Protocol)Adobe推出的實時消息傳輸協議

基於HLS媒體協議的視訊加密方案

本文只討論應用於瀏覽器環境的流媒體協議的加密。 背景 付費觀看視訊的模式是很多平臺的核心業務,如果視訊被錄製並非法傳播,付費業務將受到嚴重威脅。因此對視訊服務進行加密的技術變得尤為重要。 本文所指的視訊加密是為了讓要保護的視訊不能輕易被下載,即使下載到了也是加密後的內容,其它人解開加密後

媒體格式---FLV(flash video)

目前主流的視訊網站如優酷網,土豆網,樂視網等網站無一例外地使用了FLV格式。 1、格式 FLV由Flv Header和Flv Body組成,而Flv Body由一系列的 Tag組成,每一個Tag前面都有一個Previous Tag Size表示前一個Tag的長度。Tag的

幾種直播媒體協議

題外話: HTTP漸進下載流媒體播放:  基於TCP。 yy、樂視、愛奇藝、優酷土豆、搜狐視訊、花椒直播,主要還是通過rtmp&hls來實現的,但他們也意識到rtmp的天生缺陷,所以不管是技術預研也好,還是測試版也好,都已經或多或少在弄WebRTC了。 流媒體概述

網路直播媒體協議如何選擇?RTSP,RTMP,HTTP,私有協議

1、不管是RTSP/RTP、RTMP、HTTP,亦或是私有協議,都是可以進行流媒體傳輸的流媒體協議,而且效果都能做到差不多的程度,這裡會有同學問到HTTP流媒體協議是不是HLS,會有很大延時,巴拉巴拉,之類之類的,這裡說明一下,HLS是HTTP中的一種,可以用於對延時要求不高

媒體協議(HLS/RTSP/RTMP)比較

HLS協議: 如果要開發一套準實時的手機音視訊直播系統,需要支援iphone,Android,windows phone等多款手機,這個協議真心不錯。為什麼是準實時呢,因為客戶端播放的是最新切割的ts檔案,它的延遲取決於切片的大小。 其思路步驟: 1

媒體協議介紹(rtp/rtcp/rtsp/rtmp/mms/hls)

RTP           參考文件 RFC3550/RFC3551          Real-time Transport Protocol)是用於Internet上針對多媒體資料流的一種傳輸層協議。RTP協議詳細說明了在網際網路上傳遞音訊和視訊的標準資料包格式。RTP

H.264媒體協議格式中的Annex B格式和AVCC格式深度解析

本文需要讀者對H.264流有一定的瞭解才可以理解2種格式差異。          首先要理解的是沒有標準的H.264基本流格式。文件中的確包含了一個Annex,特別是描述了一種可能的格式Annex B格式,但是這個並不是一個必須要求的格式。標準文件中指定了視訊怎樣編碼成獨立

rtmp媒體協議播放遇到的坑

前提:前端網頁是不能直接播放rtmp或rtsp直播流的。 專案中需要播放工場倉儲物流的實時監控攝像頭。經過各種調研,發現video.min.js+videojs-flash.min.js,再加上瀏覽器安裝了adobe flash播放器,則能完美實時播放rtmp視訊了。 但是用video.min.js也踩了

網路媒體協議的聯絡與區別(RTP RTCP RTSP RTMP HLS)

# 網路流媒體協議的聯絡與區別(RTP RTCP RTSP RTMP HLS) [toc] --- # 三句話簡結 ## RTP RTCP RTSP RTMP HLS區別與聯絡 **`RTP傳輸流媒體資料、RTCP對RTP進行控制,同步、RTSP發起/終止流媒體`** **`RTP和RTCP互為姐妹關

HTTP協議下可拖動時間軸播放FLV的實現(偽媒體

prot pac -m method bytes encoding 編寫 時間軸 delay HTTP協議下實現FLV的播放其實並不復雜,當初實現的原理是使用了flowPlayer插件實現的,效果還不錯。但仍有兩大問題影響著客戶的訪問情緒: 1.預加載時頁面卡死,似乎沒有

用nginx搭建http/rtmp/hls協議的MP4/FLV媒體伺服器

前前後後搭建了兩三個星期,終於可以告一段落,nginx實在是有點強大。寫一篇筆記來記錄一下這個過程中的思路和解決方案。 一.搭建nginx平臺: 基本是基於http://blog.csdn.net/xiaoliouc/article/details/8363984 一步步安

rtmp 和 http 協議在播放 flv 媒體的區別

rtmp 是專門為傳輸網路流媒體設計的,需要伺服器(如FMS,awaza等)的支援,對流媒體內容提供比較好的版權保護,另外它本身也需要向adobe支付版權費用。 首先兩者的工作方式不一樣: rtmp 資料需要專門的伺服器接收, 如FMS, awazal等,然後通過本地的

廣電系統衛星信號ASI數據轉成UDP協議進入媒體系統互聯網分發

ASI UDP RTMP 流媒體系統 ASI:傳輸的是數字信號,壓縮視頻信號(例如MPEG2-T,裏面是H.264碼流),用於廣播電視領域。 在目前的DVB-C系統設備的傳輸接口有兩種MPEG2視頻碼流傳輸接口標準:異步串行接口ASI和同步並行接口SPI。本文

800Li 媒體和傳統http播放MP4和FLV對比

流媒體 http html5 mp4 隨著Web 應用發展的普及,在瀏覽器上播放媒體(視頻、音頻)的需求變得越來越普遍;很多的企業在嘗試在網站加入多媒體內容,最常見的倆種方式: 1. 普通的 http 文件點播 ,直接通過網站前臺 file upload 的方

媒體系統的RTMP協議

RTMP協議 流媒體系統 AMF 什麽是RTMP協議 RTMP(Real-Time Messaging Protocol實時消息傳送協議)的縮寫,它是Adobe Systems公司為Flash播放器和服務器之間音頻、視頻和數據傳輸開發的協議。這是一個標準的,未加密

[置頂][終極精簡版][圖解]Nginx搭建flv mp4媒體服務器

layer 所有 make 精簡 節點 tran clas 測試 provider 花了我接近3周,歷經了重重問題,今日終於把流媒體服務器搞定,趕緊的寫個博文以免忘記。。。   起初是跟著網上的一些教程來的,但是說的很不全面,一些東西也過時不用了(比如jwplayer老版

媒體傳輸協議介紹

level mic ntp 正常 mes 結果 傳輸層 再次 http請求 一、RTSP協議介紹 什麽是rtsp? RTSP協議以客戶服務器方式工作,,如:暫停/繼續、後退、前進等。它是一個多媒體播放控制協議,用來使用戶在播放從因特網下載的實時數據時能夠進行控制, 因此