Html5直播(1): 直播原理

 通過PC端或移動端,對於採集來說,PC爲主。對於源的質量,會買一些專業的設備,保證一定的分辨率到終端的時候非常清楚。

收集完後是一個原始的2進制數據流,經過websocket或http等上傳到服務器進行上圖處理的4個步驟。

最常見的是涉及到編碼的問題,原始的流是不能直接讓播放器去播放的,必須採用一定的協議去做編碼。

視頻壓縮編碼的常見的格式:H.264(視頻編碼)、AAC(音頻編碼)

一般直播流播出失敗的時候最容易想到的排查點是編碼是否正確。

編碼後一般會有字幕的疊加和水印等。

後期是推流,推送到服務器上去,服務器再部署推到CDN上,靜態資源發佈到CDN保證拉取速度。

CDN就是用戶直接訪問的直播的地址。

視頻格式與瀏覽器:

格式\瀏覽器 Chrome Firfox Safari
mp4 支持 支持 支持
webm 支持 支持  
hls     支持
flv      

mp4兼容性很好,但直播一般都不用mp4

hls是視頻協議

直播協議:

  • HLS協議:視頻格式hls
  • RTMP協議:視頻格式flv
  • HTTP-FLV協議:視頻格式flv

hls和flv偏直播,也可以做點播。

1.HLS協議:

蘋果推出的協議。

藉助video便籤去播放,以前是藉助flash。

video會怎麼播?

對於hls協議,會給一個M3U8文件,只給扔給video.

HLS協議就是講述直播的,和其他點播的最大的區別不會一下給你一個視頻地址,而是給你1個M3U8索引文件,video便籤是不支持M3U8文件的識別,只有Safari瀏覽器可以。可以將M3U8文件解析爲1個個片段,每個片段就是直播流的分段。

然後就涉及到M3U8文件的更新問題,因爲直播是實時的,

就涉及到播放時長(更新)的問題,就以上面來說,假設segment-1.ts需要2s,segment-2.ts需要2s,segment-3.ts需要3s,segment-4.ts需要2s,那麼一共就需要9s,在9秒之前播放器會重新請求更新M3U8文件(瀏覽器自己的行爲),更新后里面的M3U8文件就變了。

M3U8文件裏面不一定包含.ts文件,可能嵌套了M3U8文件。

M3U8還細分爲動態列表live playlist、靜態列表event playlsit、全量列表vod playlist

實際直播很少使用靜態列表。

全量列表,就是拿到的是一個不變化的。

一般動態列表就是純文本的文件,不是動態的流,例如:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TRAGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:26
#EXTINF:9.901,
http://media.example.com/wifi/segment26.ts
#EXTINF:9.901,
http://media.example.com/wifi/segment27.ts
#EXTINF:9.501,
http://media.example.com/wifi/segment28.ts

第一行表明了M3U8的版本,要看播放器支持的HLS版本是多少。

然後是默認的時長和序號。SEQUENCE+1

和大概的視頻片段時長是多少。

靜態列表,類似於:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TRAGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAULIST-TYPE:EVENT
#EXTINF:9.9001,
http://media.example.com/wifi/segment0.ts
#EXTINF:9.9001,
http://media.example.com/wifi/segment1.ts
#EXTINF:9.9001,
http://media.example.com/wifi/segment2.ts

和動態列表的區別是多了一行:

#EXT-X-PLAULIST-TYPE:EVENT。

而全量列表比動態列表多了2個東西:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TRAGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAULIST-TYPE:VOD
#EXTINF:9.9001,
http://media.example.com/wifi/segment0.ts
#EXTINF:9.9001,
http://media.example.com/wifi/segment1.ts
#EXTINF:9.9001,
http://media.example.com/wifi/segment2.ts
#EXT-X-ENDLIST

#EXT-X-PLAULIST-TYPE:VOD(表明結束)

#EXT-X-ENDLIST(表明點播)

告訴瀏覽器不用去自動更新M3U8文件了,我就是靜態的,只有一個,沒了。

ts文件:

每個ts文件,對於第一個ts文件會有一個叫PAT的包,告訴去找PMT的包,PMT告訴說哪個是TS包,哪些是視頻,哪些是音頻,TS包相連組成“幀”。哪些TS包組成幀,需要解析TS規範,TS裏的Header會有這個信息。

2.RTMP協議:

RTMP(Real Time Messaging Protocol)實時消息傳輸協議。

基於TCP,是一個協議族,包括RTMP基本協議、RTMPT/RTMPS/RTMPE等多種變種。

RTMP是一種涉及用來進行實時數據通信的網絡協議,主要用來在Flash、AIR平臺和支持RTMP協議的流媒體/交互服務器之間進行音視頻和數據通信。

傳統的軟件和服務器交互主要是用RTMP,PC端如果不是通過web方式,而是通過客戶端來做,基本走RTMP。如果採集端是用web方式,走WebRTC。這是2個不同的技術方案。

 

RTMP協議關鍵是採集和源是非常相似的,從用戶端到源這塊如果也走RTMP,則源PC端是不變的。RTMP協議傳輸過程種也是FLV格式的。無非就是通信的手段不一樣。

但是RTMP使用起來i相對複雜。

3.RTMP的升級版HTTP-FLV協議:

HLS簡單不需要像RTMP那樣處理應答,但是實時性差、延時高。

如果說延時大而又不想過多的切分片,那麼久可以選擇HTTP-FLV協議.

集合HLS優點、RTMP低延時的特性。

和RTMP的區別是都是長連接,中間傳輸的格式都是FLV,唯一的區別是在播放器和CDN建立連接通過HTTP請求:

HTTP-FLV協議的優點是可以在一定程度上避免防火牆的干擾、很好的兼容HTTP 302跳轉,做到靈活調度、可以使用HTTPS做加密通道、很好的支持移動端。但是其視頻格式是FLV。

具體要結合不同的場景採用對應的協議。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章