通過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。
具體要結合不同的場景採用對應的協議。