溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

http推流原理是什么

發(fā)布時(shí)間:2021-07-05 18:20:56 來(lái)源:億速云 閱讀:162 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“http推流原理是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“http推流原理是什么”吧!

成熟的媒體應(yīng)用往往面對(duì)這樣的需求:

  • 自定義封裝的視頻

  • 加密的音視頻

  • 對(duì)接第三方的非標(biāo)準(zhǔn)媒體源

  • 支持不同架構(gòu)的播放器

  • ……

其中一種比較靈活的解決方案是把自定義媒體數(shù)據(jù)推流為http,而大部分播放器都能很好地支持http(vlc/ffmepg/mediaplayer/ijkplayer/kodi等)。

數(shù)據(jù)流示意:

http推流原理是什么

本篇文章主要講解上圖的http協(xié)議部分。

http協(xié)議基礎(chǔ)

http協(xié)議是應(yīng)用層協(xié)議,使用tcp進(jìn)行傳輸。

請(qǐng)求報(bào)文是播放器(http客戶端)發(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

<html>
...

第一行包含了協(xié)議版本、狀態(tài)碼、狀態(tài)碼原因短語(yǔ),第2~3行是響應(yīng)首部字段,最后幾行是主體,也就是通常瀏覽器要渲染的內(nèi)容

流媒體 - http chunk

流媒體就是像流水一樣把視頻數(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告知客戶端現(xiàn)在傳輸?shù)氖欠謮K數(shù)據(jù),這樣客戶端就會(huì)維持這個(gè)連接,直到數(shù)據(jù)接收完成。

數(shù)據(jù)傳輸過(guò)程中,每個(gè)chunk都是以大小\r\n數(shù)據(jù)\r\n的格式傳輸,最后以大小0通知客戶端數(shù)據(jù)完成。

流傳輸在多媒體應(yīng)用中常用于直播,因?yàn)橹辈サ臄?shù)據(jù)長(zhǎng)度一般是不定的,這樣就可以借助客戶端和服務(wù)端間的這個(gè)長(zhǎng)連接持續(xù)不斷地傳輸媒體數(shù)據(jù)。

文件媒體 - http range

流媒體的缺點(diǎn)是不能跳進(jìn)。

不能跳進(jìn)不僅意味著用戶無(wú)法seek觀看節(jié)目,也意味著一些節(jié)目的信息無(wú)法獲取(如時(shí)長(zhǎng))。

為了支持跳進(jìn),可以借助http的range請(qǐng)求。

range請(qǐng)求常以斷點(diǎn)續(xù)傳聞名,它允許客戶端從任何位置開始,向服務(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告訴客戶端返回的數(shù)據(jù)對(duì)應(yīng)的是哪個(gè)范圍的數(shù)據(jù),這里回復(fù)的是客戶端請(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ì)在開始播放的時(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)的,所以每次客戶端來(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管理了。

點(diǎn)播管理 - http session

上節(jié)了解過(guò),seek基于多次range request的實(shí)現(xiàn)機(jī)制會(huì)導(dǎo)致在一次點(diǎn)播期間,服務(wù)端與客戶端間會(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)。示意圖如下:

http推流原理是什么

對(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ò)程主要依賴Set-CookieCookie兩個(gè)字段保證。協(xié)議也很簡(jiǎn)單,服務(wù)端通過(guò)Set-Cookie給客戶端發(fā)送id=123,客戶端識(shí)別如果有Set-Cookie,則在下次請(qǐng)求中把Set-Cookie的內(nèi)容放到Cookie中通知回服務(wù)端。

上述基本就是完成http推流所需要的核心協(xié)議了。總結(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í)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI