流媒体协议-- HTTP-FLV
生活随笔
收集整理的這篇文章主要介紹了
流媒体协议-- HTTP-FLV
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
HTTP-FLV
- HTTP-FLV簡(jiǎn)介
- 分塊傳輸編碼
- 請(qǐng)求響應(yīng)報(bào)文分析
HTTP-FLV簡(jiǎn)介
基于HTTP 1.1 分塊傳輸機(jī)制(Chunked transfer encoding)實(shí)現(xiàn)直播。
客戶端每次請(qǐng)求HTTP-FLV直播流,服務(wù)器先發(fā)送FLV header、script tag以及audio config tag和video config tag,再發(fā)送當(dāng)前時(shí)間點(diǎn)FLV音視頻數(shù)據(jù)。(一header三tag)
HTTP-FLV優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
a. 服務(wù)器兼容性好:基于HTTP協(xié)議。
b. 相對(duì)低延時(shí):直接傳輸FLV流,傳輸顆粒度小;基于HTTP長(zhǎng)連接。(發(fā)一次請(qǐng)求,客戶端分多次提供數(shù)據(jù))
缺點(diǎn):
a. 播放端兼容性不好:需要flash支持,主流瀏覽器拋棄flash。
b. 不適合多音軌:flv只能有一條音軌和一條視頻軌。
分塊傳輸編碼
通常情況下,一次HTTP應(yīng)答消息中發(fā)送的數(shù)據(jù)是整個(gè)發(fā)送的,“Content-Length”消息頭字段表示傳輸?shù)臄?shù)據(jù)大小,該字段可以讓客戶端應(yīng)用判斷數(shù)據(jù)傳輸何時(shí)結(jié)束以及后續(xù)應(yīng)答消息的何時(shí)開始。而分塊傳輸編碼是將數(shù)據(jù)切割成一段段的數(shù)據(jù)塊,每個(gè)分塊包含十六進(jìn)制的長(zhǎng)度值和數(shù)據(jù),長(zhǎng)度值獨(dú)占一行,長(zhǎng)度不包括該行結(jié)尾的 CRLF(\r\n),也不包括分塊數(shù)據(jù)結(jié)尾的CRLF,但是包括數(shù)據(jù)里面的CRLF。最后一個(gè)分塊長(zhǎng)度值必須為 0,對(duì)應(yīng)的分塊數(shù)據(jù)沒有內(nèi)容,但是必須跟兩個(gè)CRLF,表示實(shí)體結(jié)束,也就是說最后一個(gè)分塊為:“0\r\n\r\n”。這樣的話,服務(wù)器不需要在發(fā)送數(shù)據(jù)前預(yù)先知道發(fā)送內(nèi)容的總大小。
HTTP分塊傳輸編碼允許服務(wù)器為動(dòng)態(tài)生成的內(nèi)容維持HTTP持久連接(長(zhǎng)連接)。相當(dāng)于說“Content-Length”無限大,數(shù)據(jù)的傳輸不會(huì)停止,那TCP連接自然一直存在。而直播場(chǎng)景就是屬于典型的“內(nèi)容動(dòng)態(tài)生成”的實(shí)例,這是HTTP-FLV直播實(shí)現(xiàn)的基礎(chǔ)。
分塊傳輸通過改變報(bào)文格式來優(yōu)化傳輸,除此之外,還可以通過“內(nèi)容編碼”的方式來優(yōu)化傳輸,方式是對(duì)實(shí)體內(nèi)容進(jìn)行壓縮編碼(如gzip),對(duì)應(yīng)的消息頭部字段是“Content-Encoding”。
對(duì)于客戶端應(yīng)用,判斷傳輸結(jié)束,要關(guān)閉tcp連接的方式有兩種:
i. 通過HTTP響應(yīng)報(bào)文Content-Length字段獲得實(shí)體內(nèi)容的大小,如果接收到的數(shù)據(jù)與之相等,就認(rèn)為傳輸結(jié)束,關(guān)閉連接。
ii. 通過檢查分塊傳輸編碼的分塊長(zhǎng)度,如果是0,那說明傳輸結(jié)束,關(guān)閉連接。
h. 報(bào)文示例:HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked ---> 接下來的實(shí)體內(nèi)容采用分塊傳輸編碼25 --> 十六進(jìn)制表示的塊大小,即接下來傳輸37(0x25)字節(jié)的實(shí)體內(nèi)容 This is the data in the first chunk (\r\n) --> 空一行,顯式的換行符 1C and this is the second one (\r\n) 3 con 8 sequence 0 --> 傳輸結(jié)束 (\r\n) (\r\n) 解析:"This is the data in the first chunk\r\n" (37 字符 => 十六進(jìn)制: 0x25) "and this is the second one\r\n" (28 字符 => 十六進(jìn)制: 0x1C) "con" (3 字符 => 十六進(jìn)制: 0x03) "sequence" (8 字符 => 十六進(jìn)制: 0x08) 那么解碼后的實(shí)體內(nèi)容為:This is the data in the first chunk and this is the second one consequence
請(qǐng)求響應(yīng)報(bào)文分析
下面是一份HTTP-FLV 請(qǐng)求-響應(yīng)的報(bào)文:
GET http: //192.168.0.102:8080/live?port=1935&app=myapp&stream=mystream HTTP/1.1 Host: 192.168.0.102:8080 Accept: */* Accept-Language: zh_CN User-Agent: VLC/3.0.12 LibVLC/3.0.12 Range: bytes=0-HTTP/1.1 200 OK Connection: close Transfer-Encoding: chunked ----> 服務(wù)器返回分塊傳輸關(guān)鍵字,而不是客戶端請(qǐng)求報(bào)文帶的!! Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: * Content-Type: video/x-flv Date: Sun, 07 Mar 2021 08:21:23 GMT Expires: -1 Server: nginx/1.18.02a03 ----> 當(dāng)前chunk的字節(jié)數(shù) FLV..... ................. onMetaData...Server..DNGINX HTTP-FLV (https: //github.com/winshining/nginx-http-flv-module)..width.@.........height.@.........displayWidth.@........ displayHeight.@.........duration.......... framerate.@8........fps.@8....... videodatarate.@.........videocodecid.@........ audiodatarate.@gu.......audiocodecid.@$........profile ....傳輸?shù)姆绞绞莄hunked。
響應(yīng)頭后面跟著chunk字節(jié)數(shù),以及flv data。
總結(jié)
以上是生活随笔為你收集整理的流媒体协议-- HTTP-FLV的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 憎恨之心最强套装攻略_憎恨之心S套装最好
- 下一篇: couchbase java 手册_使用