iOS動手做一個直播(原理篇)

3033發表於2019-03-02

開篇

112362441-d34e615a59e07987

傳輸簡單示意圖

上篇文章主要給出了程式碼,但是並沒有詳細說明直播相關的知識,這篇文章就說一下直播的相關理論知識。附上直播程式碼篇地址。

推流

騰訊直播平臺,阿里直播平臺,百度直播平臺提供均為RTMP的推流和HLS/RTMP等拉流.
推流是一個直播不可缺少的成分,說起推流都會說基於RTMP協議,那什麼是RTMP呢?
RTMP全稱:Real Time Messaging Protocol(實時訊息傳送協議)
1)、工作在TCP之上的明文協議,使用埠1935;
2)、RTMPT封裝在HTTP請求之中,可穿越防火牆;
3)、RTMPS類似RTMPT,但使用的是HTTPS連線;
RTMP協議是被Flash用 於物件、視訊、音訊的傳輸。這個協議建立在TCP協議或者輪詢HTTP協議之上。RTMP協議就像一個用來裝資料包的容器,這些資料既可以是AMF格式的 資料,也可以是FLV中的視音訊資料。一個單一的連線可以通過不同的通道傳輸多路網路流,這些通道中的包都是按照固定大小的包傳輸的。

直播中常見的協議還有
  • RTSP(Real Time Streaming Protocol,實時流傳輸協議):定義了一對多應用程式 如何有效地通過IP網路傳送多媒體資料。
  • RTP(Real-time Transport Protocol,實時傳輸協議):RTP是針對多媒體資料流的一種傳輸層協議,詳細說明了在網際網路上傳遞音訊和視訊的標準資料包格式。RTP協議常用於流媒體系統(配合RTCP協議),視訊會議和一鍵通系統(配合H.323或SIP),使它成為IP電話產業的技術基礎。
  • RTCP(Real-time Transport Control Protocol,實時傳輸控制協議):RTCP是RTP的配套協議,為RTP媒體流提供通道外的控制。RTCP和RTP一起協作將多媒體資料打包和傳送,定期在多媒體流會話參與者之間傳輸控制資料。
    RTCP的主要功能是為RTP所提供的服務質量(QoS)提供反饋,收集相關媒體連線的統計資訊,例如傳輸位元組數,傳輸分組數,丟失分組數,單向和雙向網路延遲等等。網路應用程式可以利用RTCP所提供的資訊來提高服務質量,比如限制流量或改用壓縮比小的編解碼器。

步驟

在客戶端上要完成直播視訊的採集及RTMP上推,主要需要以下幾個步驟:
1.音視訊的採集;
2.對視訊進行H264編碼,對音訊進行AAC編碼;
3.對編碼後的音、視訊資料進行FLV封包;
4.建立RTMP連線並上推到服務端。
而在將原始視訊編碼過程中,有兩種方案:一種是利用第三方庫FFmpeg 進行編碼,一種是利用iOS自身的AVAssetWriter 或VideoToolBox.framework的VTCompressionSession進行編碼。FFmpeg因其跨平臺及功能豐富等諸多優勢,被廣泛使用。而使用AVAssetWriter編碼需要將視訊寫入本地檔案,然後通過實時監聽檔案內容的改變,讀取檔案並處理封包。從iOS8開始,VideoToolBox提供了硬體編碼支援,可以使用VTCompressionSession進行編碼。

H264編碼與AAC編碼

伺服器的搭建

說了這麼多到伺服器的搭建了,這裡提供兩個流媒體伺服器搭建的地址,按照這個地址我們可以自己搭建伺服器進行推流。因為過程和截圖實在是比較詳細,我就不再重複截圖一遍了,傳送門:iOS基於RTMP 的視訊推流
HLS-搭建Nginx流媒體伺服器(3)
以及IOS手機直播Demo技術簡介。需要知道的就是,現在直播應用,採用RTMP協議居多,也有部分使用HLS協議。
採用RTMP協議,就要看下它與流媒體伺服器互動的過程,RTMP協議的預設埠是1935,採用TCP協議。並且需要了解FLV的封裝格式。

拉流

直播測試的實現的總體思路大致就是,(開源推流框架:騰訊,優酷等)+ (Nginx+RTMP) + (ijkplayer)。
我們要實現我們的直播播放,就是把獲取到的資料解壓縮,恢復成原始資料。解碼就是將H264變成YUV,AAC變成PCM。
解碼可以使用軟解碼,硬解碼。
軟解碼就是利用CPU資源去解壓縮資料,採用的方式是FFmpeg解碼。
硬解碼,對於iOS平臺來說,可以使用VideoToolbox.Framework(該框架只能在iOS 8.0及以上系統使用)。為了方便我們的實現,我們採用的一般方式是第三方的SDK,網易雲直播,暴風雲直播,騰訊雲直播,新浪雲,VideoCore ,以及嗶哩嗶哩的ijkplayer等。
有比較多的SDk可以幫助我們去實現播放和推流 。

名詞介紹

後記

本來還想自己多寫寫來著,但是知道看了一篇知乎,覺得自己確實漲了不少知識,這裡放上鍊接,如何搭建一個完整的視訊直播系統?我自己先去好好看看了。
通過我的學習與研究後續再更新吧。

相關文章