###開篇
上篇文章主要給出了程式碼,但是並沒有詳細說明直播相關的知識,這篇文章就說一下直播的相關理論知識。附上直播程式碼篇地址。
###推流
騰訊直播平臺,阿里直播平臺,百度直播平臺提供均為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編碼
- H.264編碼
還記得之前的一次面試中,談到H264編碼,當時完全不知道(-_-`).
H264是一種高壓縮率的編碼標準,如何壓縮嘞?一般的視訊採集都是25幀/秒,也就是每秒截圖25次,其實每一張圖片的內容都相差不大,壓縮的辦法就是利用演算法,只將每張圖片變動差異化的部分儲存下來,這樣視訊檔案就小多了。這裡放幾篇學習的文章,瞭解 H.264 編碼,iOS8系統H264視訊硬體編解碼說明,H.264硬編碼程式碼。 - AAC編碼
iOS音訊AAC視訊H264編碼 推流最佳方案
####伺服器的搭建
說了這麼多到伺服器的搭建了,這裡提供兩個流媒體伺服器搭建的地址,按照這個地址我們可以自己搭建伺服器進行推流。因為過程和截圖實在是比較詳細,我就不再重複截圖一遍了,傳送門: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可以幫助我們去實現播放和推流 。
####名詞介紹
- HLS
HTTP Live Streaming,HLS 是蘋果公司QuickTime X和iPhone軟體系統的一部分。它的工作原理是把整個流分成一個個小的基於HTTP的檔案來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的資料速率。在開始一個流媒體會話時,客戶端會下載一個包含後設資料的extended M3U (m3u8) playlist檔案,用於尋找可用的媒體流。
這裡介紹兩個介紹比較不錯的文章如何使用iOS實現《羋月傳》的直播、點播、快取?-HTTP Live Streaming (HLS)(一),如何使用iOS實現《羋月傳》的直播、點播、快取?-HTTP Live Streaming (HLS)(二)
####後記
本來還想自己多寫寫來著,但是知道看了一篇知乎,覺得自己確實漲了不少知識,這裡放上鍊接,如何搭建一個完整的視訊直播系統?我自己先去好好看看了。
通過我的學習與研究後續再更新吧。 轉載註明出處和網址。