開篇
上篇文章主要給出了代碼,但是并沒有詳細(xì)說明直播相關(guān)的知識,這篇文章就說一下直播的相關(guān)理論知識冯乘。附上直播代碼篇地址。
推流
騰訊直播平臺,阿里直播平臺,百度直播平臺提供均為RTMP的推流和HLS/RTMP等拉流.
推流是一個直播不可缺少的成分咱台,說起推流都會說基于RTMP協(xié)議蛤奢,那什么是RTMP呢?
RTMP全稱:Real Time Messaging Protocol(實時消息傳送協(xié)議)
1)饵骨、工作在TCP之上的明文協(xié)議翘悉,使用端口1935;
2)居触、RTMPT封裝在HTTP請求之中妖混,可穿越防火墻;
3)轮洋、RTMPS類似RTMPT制市,但使用的是HTTPS連接;
RTMP協(xié)議是被Flash用 于對象弊予、視頻祥楣、音頻的傳輸。這個協(xié)議建立在TCP協(xié)議或者輪詢HTTP協(xié)議之上汉柒。RTMP協(xié)議就像一個用來裝數(shù)據(jù)包的容器误褪,這些數(shù)據(jù)既可以是AMF格式的 數(shù)據(jù),也可以是FLV中的視音頻數(shù)據(jù)碾褂。一個單一的連接可以通過不同的通道傳輸多路網(wǎng)絡(luò)流兽间,這些通道中的包都是按照固定大小的包傳輸?shù)摹?/p>
直播中常見的協(xié)議還有
RTSP(Real Time Streaming Protocol,實時流傳輸協(xié)議):定義了一對多應(yīng)用程序 如何有效地通過IP網(wǎng)絡(luò)傳送多媒體數(shù)據(jù)斋扰。
RTP(Real-time Transport Protocol渡八,實時傳輸協(xié)議):RTP是針對多媒體數(shù)據(jù)流的一種傳輸層協(xié)議啃洋,詳細(xì)說明了在互聯(lián)網(wǎng)上傳遞音頻和視頻的標(biāo)準(zhǔn)數(shù)據(jù)包格式。RTP協(xié)議常用于流媒體系統(tǒng)(配合RTCP協(xié)議)屎鳍,視頻會議和一鍵通系統(tǒng)(配合H.323或SIP)宏娄,使它成為IP電話產(chǎn)業(yè)的技術(shù)基礎(chǔ)。
RTCP(Real-time Transport Control Protocol逮壁,實時傳輸控制協(xié)議):RTCP是RTP的配套協(xié)議孵坚,為RTP媒體流提供信道外的控制。RTCP和RTP一起協(xié)作將多媒體數(shù)據(jù)打包和發(fā)送窥淆,定期在多媒體流會話參與者之間傳輸控制數(shù)據(jù)卖宠。
RTCP的主要功能是為RTP所提供的服務(wù)質(zhì)量(QoS)提供反饋,收集相關(guān)媒體連接的統(tǒng)計信息忧饭,例如傳輸字節(jié)數(shù)扛伍,傳輸分組數(shù),丟失分組數(shù)词裤,單向和雙向網(wǎng)絡(luò)延遲等等刺洒。網(wǎng)絡(luò)應(yīng)用程序可以利用RTCP所提供的信息來提高服務(wù)質(zhì)量,比如限制流量或改用壓縮比小的編解碼器吼砂。
步驟
在客戶端上要完成直播視頻的采集及RTMP上推逆航,主要需要以下幾個步驟:
1.音視頻的采集;
2.對視頻進行H264編碼渔肩,對音頻進行AAC編碼因俐;
3.對編碼后的音、視頻數(shù)據(jù)進行FLV封包周偎;
4.建立RTMP連接并上推到服務(wù)端抹剩。
而在將原始視頻編碼過程中,有兩種方案:一種是利用第三方庫FFmpeg 進行編碼栏饮,一種是利用iOS自身的AVAssetWriter 或VideoToolBox.framework的VTCompressionSession進行編碼吧兔。FFmpeg因其跨平臺及功能豐富等諸多優(yōu)勢磷仰,被廣泛使用袍嬉。而使用AVAssetWriter編碼需要將視頻寫入本地文件,然后通過實時監(jiān)聽文件內(nèi)容的改變灶平,讀取文件并處理封包伺通。從iOS8開始,VideoToolBox提供了硬件編碼支持逢享,可以使用VTCompressionSession進行編碼罐监。
H264編碼與AAC編碼
- H.264編碼
還記得之前的一次面試中,談到H264編碼瞒爬,當(dāng)時完全不知道(-_-`).
H264是一種高壓縮率的編碼標(biāo)準(zhǔn)弓柱,如何壓縮嘞沟堡?一般的視頻采集都是25幀/秒,也就是每秒截圖25次矢空,其實每一張圖片的內(nèi)容都相差不大航罗,壓縮的辦法就是利用算法,只將每張圖片變動差異化的部分保存下來屁药,這樣視頻文件就小多了粥血。這里放幾篇學(xué)習(xí)的文章,了解 H.264 編碼,iOS8系統(tǒng)H264視頻硬件編解碼說明,H.264硬編碼代碼酿箭。 - AAC編碼
iOS音頻AAC視頻H264編碼 推流最佳方案
服務(wù)器的搭建
說了這么多到服務(wù)器的搭建了复亏,這里提供兩個流媒體服務(wù)器搭建的地址,按照這個地址我們可以自己搭建服務(wù)器進行推流缭嫡。因為過程和截圖實在是比較詳細(xì)缔御,我就不再重復(fù)截圖一遍了,傳送門:iOS基于RTMP 的視頻推流 與
HLS-搭建Nginx流媒體服務(wù)器(3)以及IOS手機直播Demo技術(shù)簡介妇蛀。需要知道的就是刹淌,現(xiàn)在直播應(yīng)用,采用RTMP協(xié)議居多讥耗,也有部分使用HLS協(xié)議有勾。
采用RTMP協(xié)議,就要看下它與流媒體服務(wù)器交互的過程古程,RTMP協(xié)議的默認(rèn)端口是1935蔼卡,采用TCP協(xié)議。并且需要了解FLV的封裝格式挣磨。
拉流
直播測試的實現(xiàn)的總體思路大致就是雇逞,(開源推流框架:騰訊,優(yōu)酷等)+ (Nginx+RTMP) + (ijkplayer)茁裙。
我們要實現(xiàn)我們的直播播放塘砸,就是把獲取到的數(shù)據(jù)解壓縮,恢復(fù)成原始數(shù)據(jù)晤锥。解碼就是將H264變成YUV掉蔬,AAC變成PCM。
解碼可以使用軟解碼矾瘾,硬解碼女轿。
軟解碼就是利用CPU資源去解壓縮數(shù)據(jù),采用的方式是FFmpeg解碼壕翩。
硬解碼蛉迹,對于iOS平臺來說,可以使用VideoToolbox.Framework(該框架只能在iOS 8.0及以上系統(tǒng)使用)放妈。為了方便我們的實現(xiàn)北救,我們采用的一般方式是第三方的SDK荐操,網(wǎng)易云直播,暴風(fēng)云直播珍策,騰訊云直播淀零,新浪云,VideoCore 膛壹,以及嗶哩嗶哩的ijkplayer等驾中。
有比較多的SDk可以幫助我們?nèi)崿F(xiàn)播放和推流 。
名詞介紹
- HLS
HTTP Live Streaming模聋,HLS 是蘋果公司QuickTime X和iPhone軟件系統(tǒng)的一部分肩民。它的工作原理是把整個流分成一個個小的基于HTTP的文件來下載,每次只下載一些链方。當(dāng)媒體流正在播放時持痰,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應(yīng)不同的數(shù)據(jù)速率祟蚀。在開始一個流媒體會話時工窍,客戶端會下載一個包含元數(shù)據(jù)的extended M3U (m3u8) playlist文件,用于尋找可用的媒體流前酿。
這里介紹兩個介紹比較不錯的文章如何使用iOS實現(xiàn)《羋月傳》的直播患雏、點播、緩存罢维?-HTTP Live Streaming (HLS)(一),如何使用iOS實現(xiàn)《羋月傳》的直播淹仑、點播、緩存肺孵?-HTTP Live Streaming (HLS)(二)
后記
本來還想自己多寫寫來著匀借,但是知道看了一篇知乎,覺得自己確實漲了不少知識平窘,這里放上鏈接吓肋,如何搭建一個完整的視頻直播系統(tǒng)?我自己先去好好看看了瑰艘。
通過我的學(xué)習(xí)與研究后續(xù)再更新吧是鬼。 轉(zhuǎn)載注明出處和網(wǎng)址。