常見的流媒體協(xié)議
- 常見的流媒體協(xié)議有很多比如:
- RTP(Real-time Transport Protocol), 常用語電話會議, 網(wǎng)絡電話等場景, 但是缺點是不提供網(wǎng)絡保障
- RTCP(Real-time Transport Control Protocol), 是實時傳輸協(xié)議(RTP)的一個姐妹協(xié)議, 也常用于語電話會議, 網(wǎng)絡電話等場景.
- RTMP(Real Time Streaming Protocol), RTMP是Adobe開發(fā)的協(xié)議
- HLS(HTTP Live Streaming)是蘋果公司(Apple Inc.)實現(xiàn)的基于HTTP的流媒體傳輸協(xié)議,可實現(xiàn)流媒體的直播和點播
HLS(HTTP Live Streaming)
- HTTP Live Streaming(HLS)是蘋果公司實現(xiàn)的基于HTTP的流媒體傳輸協(xié)議,可實現(xiàn)流媒體的直播和點播腊状。原理上是將視頻流分片成一系列HTTP下載文件。所以诗力,HLS比RTMP有較高的延遲囚痴。HLS基于HTTP協(xié)議實現(xiàn),傳輸內(nèi)容包括兩部分智绸,一是M3U8描述文件窝稿,二是TS媒體文件
- 相對于常見的流媒體直播協(xié)議楣富,例如RTMP協(xié)議、RTSP協(xié)議伴榔、MMS協(xié)議等纹蝴,HLS直播最大的不同在于庄萎,直播客戶端獲取到的,并不是一個完整的數(shù)據(jù)流塘安。HLS協(xié)議在服務器端將直播數(shù)據(jù)流存儲為連續(xù)的惨恭、很短時長的媒體文件(MPEG-TS格式),而客戶端則不斷的下載并播放這些小文件耙旦,因為服務器端總是會將最新的直播數(shù)據(jù)生成新的小文件脱羡,這樣客戶端只要不停的按順序播放從服務器獲取到的文件,就實現(xiàn)了直播免都。
- 由此可見锉罐,基本上可以認為,HLS是以點播的技術(shù)方式來實現(xiàn)直播绕娘。
- 工作流程為:
- 采集視頻源和音頻源的數(shù)據(jù)
- 對原始數(shù)據(jù)進行H264編碼和AAC編碼
- 視頻和音頻數(shù)據(jù)封裝為MPEG-TS包
- HLS分段生成策略及m3u8索引文件
- HTTP傳輸協(xié)議傳輸數(shù)據(jù)
工作流程.png
- 使用FFmpeg命令將mp4文件切換成m3u8&ts切片
// 安裝Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
// 安裝FFmpeg
brew install ffmpeg
// 執(zhí)行轉(zhuǎn)換命令
ffmpeg -i XXX.mp4 -c:v libx264 -c:a copy -f hls XXX.m3u8
- m3u8索引頭解析
m3u8索引頭解析.png
RTMP
- RTMP協(xié)議是 Adobe 公司開發(fā)的一個基于TCP的應用層協(xié)議脓规,Adobe 公司也公布了關于RTMP的規(guī)范
- RTMP本質(zhì)上是流協(xié)議,主要的優(yōu)勢是:
- 實時性高:RTMP的實時性在3秒之內(nèi)险领,經(jīng)過多層CDN節(jié)點分發(fā)后侨舆,實時性也在3秒左右,在一些實時性有要求的應用中以RTMP為主。
- 支持加密:RTMPE和RTMPS為加密協(xié)議
- 穩(wěn)定性高:HTTP也很穩(wěn)定绢陌,但HTTP是在協(xié)議上穩(wěn)定穩(wěn)定性不只是服務端的事情挨下,在CDN分發(fā),服務器管理脐湾,客戶端的支持上
- RTMP的使用
- RTMP協(xié)議也要客戶端和服務器通過“握手”來建立基于傳輸層鏈接之上的RTMP Connection鏈接臭笆,在Connection鏈接上會傳輸一些控制信息
- TMP協(xié)議傳輸時會對數(shù)據(jù)做自己的格式化,這種格式的消息我們稱之為RTMP Message
- 而實際傳輸?shù)臅r候為了更好地實現(xiàn)多路復用秤掌、分包和信息的公平性愁铺,發(fā)送端會把Message劃分為帶有Message ID的Chunk,每個Chunk可能是一個單獨的Message闻鉴,也可能是Message的一部分茵乱,在接受端會根據(jù)chunk中包含的data的長度,message id和message的長度把chunk還原成完整的Message孟岛,從而實現(xiàn)信息的收發(fā)瓶竭。