本篇內(nèi)容主要講解“http推流原理是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“http推流原理是什么”吧!
創(chuàng)新互聯(lián)公司專(zhuān)注于遼寧網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供遼寧營(yíng)銷(xiāo)型網(wǎng)站建設(shè),遼寧網(wǎng)站制作、遼寧網(wǎng)頁(yè)設(shè)計(jì)、遼寧網(wǎng)站官網(wǎng)定制、重慶小程序開(kāi)發(fā)服務(wù),打造遼寧網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供遼寧網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
成熟的媒體應(yīng)用往往面對(duì)這樣的需求:
自定義封裝的視頻
加密的音視頻
對(duì)接第三方的非標(biāo)準(zhǔn)媒體源
支持不同架構(gòu)的播放器
……
其中一種比較靈活的解決方案是把自定義媒體數(shù)據(jù)推流為http,而大部分播放器都能很好地支持http(vlc/ffmepg/mediaplayer/ijkplayer/kodi等)。
數(shù)據(jù)流示意:
本篇文章主要講解上圖的http協(xié)議部分。
http協(xié)議是應(yīng)用層協(xié)議,使用tcp進(jìn)行傳輸。
請(qǐng)求報(bào)文是播放器(http客戶(hù)端)發(fā)給http服務(wù)器的內(nèi)容,由請(qǐng)求方法、請(qǐng)求URI、協(xié)議版本、可選的請(qǐng)求首部字段和內(nèi)容實(shí)體構(gòu)成,如:
POST /media HTTP/1.1 Host: 127.0.0.1:8000 Content-Type: application/x-www-form-urlencoded Content-Length: 10 path=/tmp/1.mp4
第1行包含了請(qǐng)求方法、請(qǐng)求URI、協(xié)議版本,第2~4行是請(qǐng)求首部字段,最后一行是內(nèi)容實(shí)體。
響應(yīng)報(bào)文由協(xié)議版本、狀態(tài)碼、狀態(tài)碼原因短語(yǔ)、可選的響應(yīng)首部字段和實(shí)體主體構(gòu)成,如:
HTTP/1.1 200 OK Content-Length: 53 Content-Type: text/html ...
第一行包含了協(xié)議版本、狀態(tài)碼、狀態(tài)碼原因短語(yǔ),第2~3行是響應(yīng)首部字段,最后幾行是主體,也就是通常瀏覽器要渲染的內(nèi)容
流媒體就是像流水一樣把視頻數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳輸?shù)浇K端上播放。
通過(guò)http推送流媒體的時(shí)候,對(duì)應(yīng)的是http的chunk傳輸。
chunk傳輸?shù)牡湫停憫?yīng))報(bào)文如下:
HTTP/1.1 200 OK Transfer-Encoding: chunked Content-Type: video/mpeg 400 ...ad....fxa... ... 400 xai.. ... 0
即,通過(guò)Transfer-Encoding: chunked
告知客戶(hù)端現(xiàn)在傳輸?shù)氖欠謮K數(shù)據(jù),這樣客戶(hù)端就會(huì)維持這個(gè)連接,直到數(shù)據(jù)接收完成。
數(shù)據(jù)傳輸過(guò)程中,每個(gè)chunk都是以大小\r\n數(shù)據(jù)\r\n
的格式傳輸,最后以大小0通知客戶(hù)端數(shù)據(jù)完成。
流傳輸在多媒體應(yīng)用中常用于直播,因?yàn)橹辈サ臄?shù)據(jù)長(zhǎng)度一般是不定的,這樣就可以借助客戶(hù)端和服務(wù)端間的這個(gè)長(zhǎng)連接持續(xù)不斷地傳輸媒體數(shù)據(jù)。
流媒體的缺點(diǎn)是不能跳進(jìn)。
不能跳進(jìn)不僅意味著用戶(hù)無(wú)法seek觀看節(jié)目,也意味著一些節(jié)目的信息無(wú)法獲取(如時(shí)長(zhǎng))。
為了支持跳進(jìn),可以借助http的range請(qǐng)求。
range請(qǐng)求常以斷點(diǎn)續(xù)傳聞名,它允許客戶(hù)端從任何位置開(kāi)始,向服務(wù)器請(qǐng)求任意長(zhǎng)度的數(shù)據(jù)。
比如:
POST /media HTTP/1.1 Host: 127.0.0.1:8000 Content-Type: application/x-www-form-urlencoded Content-Length: 10 Range: bytes=500-1000 path=/tmp/1.mp4
這個(gè)請(qǐng)求報(bào)文通過(guò)Range
向服務(wù)器請(qǐng)求了第500~1000字節(jié)的數(shù)據(jù)(共501字節(jié),第一個(gè)字節(jié)是索引0)
服務(wù)器如果能正確返回這部分?jǐn)?shù)據(jù),就回復(fù):
HTTP/1.1 206 OK Content-Length: 53 Content-Type: video/mpeg Accept-Ranges: bytes Content-Range: bytes 500-1000/1024 Content-Length: 501 ....
Accept-Ranges:bytes
意思是接收按字節(jié)為單位進(jìn)行range請(qǐng)求;Content-Range
告訴客戶(hù)端返回的數(shù)據(jù)對(duì)應(yīng)的是哪個(gè)范圍的數(shù)據(jù),這里回復(fù)的是客戶(hù)端請(qǐng)求的500-1000
,其中1024
是整個(gè)媒體的數(shù)據(jù)長(zhǎng)度;Content-Length
表示返回的數(shù)據(jù)長(zhǎng)度(1000-500+1 = 501)
所以,一般播放器在播放http源的時(shí)候要進(jìn)行seek就是通過(guò)發(fā)起新的http請(qǐng)求,并在請(qǐng)求中加入Range
字段來(lái)從seek的目標(biāo)位置讀取數(shù)據(jù)。
然而,實(shí)際情況會(huì)復(fù)雜一些。
其一,播放器可能會(huì)在開(kāi)始播放的時(shí)候就會(huì)跳轉(zhuǎn)到尾部讀取視頻數(shù)據(jù),以確定節(jié)目時(shí)長(zhǎng)(比如ts封裝就需要讀取尾部數(shù)據(jù)來(lái)估算視頻時(shí)長(zhǎng));
其二,seek可能需要經(jīng)過(guò)多次range請(qǐng)求才能跳轉(zhuǎn)到目標(biāo)位置(如ffmpeg會(huì)用二分查找來(lái)查找目標(biāo)時(shí)間點(diǎn));
其三,http是無(wú)狀態(tài)的,所以每次客戶(hù)端來(lái)的請(qǐng)求所在的處理線程不一定相同,而且同次點(diǎn)播的多個(gè)http請(qǐng)求間是無(wú)關(guān)聯(lián)的。這對(duì)于靜態(tài)文件資源而言是無(wú)關(guān)緊要的,但對(duì)于動(dòng)態(tài)內(nèi)存資源(如動(dòng)態(tài)解密的視頻)而言就需要謹(jǐn)慎處理多線程問(wèn)題和session管理了。
上節(jié)了解過(guò),seek基于多次range request的實(shí)現(xiàn)機(jī)制會(huì)導(dǎo)致在一次點(diǎn)播期間,服務(wù)端與客戶(hù)端間會(huì)有多次的通信,而http的無(wú)狀態(tài)特性導(dǎo)致這幾次通信是無(wú)關(guān)聯(lián)的,服務(wù)器無(wú)從知道這幾次通信對(duì)應(yīng)的是同一次點(diǎn)播。
通用的解決方法是利用http的cookie機(jī)制,在多次通信中攜帶id字段進(jìn)行session關(guān)聯(lián)。示意圖如下:
對(duì)應(yīng)于http報(bào)文則是:
"第一次通信":
POST /media HTTP/1.1 Host: 127.0.0.1:8000 Content-Type: application/x-www-form-urlencoded Content-Length: 10 Range: bytes=0- path=/tmp/1.mp4
"你的id是123":
HTTP/1.1 206 OK Content-Length: 53 Content-Type: video/mpeg Accept-Ranges: bytes Content-Range: bytes 0-1023/1024 Content-Length: 1024 Set-Cookie: id=123 ....
"我的id是123,Range 500-1000":
POST /media HTTP/1.1 Host: 127.0.0.1:8000 Content-Type: application/x-www-form-urlencoded Content-Length: 10 Range: bytes=500-1000 Cookie: id=123 path=/tmp/1.mp4
"你的id是123,你的請(qǐng)求已受理":
HTTP/1.1 206 OK Content-Length: 53 Content-Type: video/mpeg Accept-Ranges: bytes Content-Range: bytes 500-1000/1024 Content-Length: 501 Set-Cookie: id=123 ....
上面通信過(guò)程主要依賴(lài)Set-Cookie
和Cookie
兩個(gè)字段保證。協(xié)議也很簡(jiǎn)單,服務(wù)端通過(guò)Set-Cookie
給客戶(hù)端發(fā)送id=123
,客戶(hù)端識(shí)別如果有Set-Cookie
,則在下次請(qǐng)求中把Set-Cookie
的內(nèi)容放到Cookie
中通知回服務(wù)端。
上述基本就是完成http推流所需要的核心協(xié)議了??偨Y(jié)下:
http傳輸基于tcp,是可靠連接
傳輸流媒體可以使用chunk傳輸
為支持seek,需要支持range請(qǐng)求
seek實(shí)現(xiàn)中,如果服務(wù)端資源是動(dòng)態(tài)的,需要通過(guò)cookie引入session機(jī)制
到此,相信大家對(duì)“http推流原理是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!